[英]Why I can't use unsigned short in switch/case?
我在ClsA
有兩個靜態成員聲明,如下所示:
class ClsA {
public:
static unsigned short m_var1;
static unsigned short m_var2;
};
unsigned short ClsA::m_var1 = 1001;
unsigned short ClsA::m_var2 = 1002;
在ClsB
,我使用這些靜態成員中的聲明, ClsA
是這樣的:
unsigned short var1; // assume var1 is declare/use some where in the code.
switch( var1 ) {
case ClsA::m_var1: // Error: cannot appear in a constant-expression
break;
case ClsB::m_var2: // Error: cannot appear in a constant-expression
break;
}
如果我在switch語句中使用它,為什么會出現錯誤? 如果我在if語句中使用它,則沒有錯誤。
C ++要求case
具有一個constant-expression作為其參數。 這意味着什么? 這意味着在常量表達式中唯一合法的操作數是:
const
值,使用常量表達式初始化 sizeof
表達式 在您的情況下,如果您將靜態成員聲明為const
,並在使用整型常量表達式聲明時初始化它們,則可以在switch-case語句中使用它們。 例如,
class ClsA {
public:
static const unsigned short m_var1 = 13;
static const unsigned short m_var2 = 42;
};
如果,另一方面,你堅持在一個可變開關 ,以避免多個if-else if語句,我建議使用跳轉表(它也被稱為查找表)。
嘗試
static const unsigned short m_var1;
m_var1和m_var2不是常量。 但是switch中的情況必須是常量表達式(1,4 * 8,some_const + 1)。
這是因為case
關鍵字后面的表達式必須是編譯時常量,而m_var1
和m_var2
不是。 如果需要進行此類測試,請使用if
鏈。
值必須是編譯時常量,如錯誤消息所示。 它們應該在類聲明中聲明並定義為const
,以便編譯器在任何編譯點知道它們及其值,通常在頭文件中。
class ClsA {
public:
static unsigned short const m_var1 = 1001;
static unsigned short const m_var2 = 1002;
};
在某些目標文件中,您還應該實例化這些const
變量
unsigned short const ClsA::m_var1;
unsigned short const ClsA::m_var2;
即沒有重復初始化值且沒有static
關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.