簡體   English   中英

為什么我不能在開關/外殼中使用無符號短路?

[英]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_var1m_var2不是。 如果需要進行此類測試,請使用if鏈。

http://gcc.gnu.org/ml/gcc-help/2005-12/msg00069.html談論此錯誤。

值必須是編譯時常量,如錯誤消息所示。 它們應該在類聲明中聲明並定義為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM