代码之家  ›  专栏  ›  技术社区  ›  huahsin68

为什么我不能在switch/case中使用unsigned short?

c c++
  •  4
  • huahsin68  · 技术社区  · 14 年前

    我有两个静态成员声明 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 ,我使用的静态成员声明来自 里昂证券 这样地:

    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语句中使用它,就不会有错误。

    5 回复  |  直到 14 年前
        1
  •  11
  •   Michael F    14 年前

    C++需要 case 有一个 常量表达式 作为它的论点。那是什么意思?它意味着在常量表达式中唯一合法的操作数是:

    • 直接常量
    • 枚举型常量
    • 声明为的值 const 用常量表达式初始化的
    • sizeof 表达

    在您的情况下,如果将静态成员声明为 康斯特 ,并在用整型常量表达式声明时初始化它们,可以在switch case语句中使用它们。例如,

    class ClsA {
        public:
            static const unsigned short m_var1 = 13;
            static const unsigned short m_var2 = 42;
    };
    

    另一方面,如果你坚持 切换 为了避免使用多个if-else if语句,我建议使用跳转表(它也被称为查找表)。

        2
  •  10
  •   Stefan    14 年前

    尝试

    static const unsigned short m_var1;

        3
  •  0
  •   user395760    14 年前

    m_var1和m_var2不是常数。但是switch中的情况必须是常量表达式(1,4*8,一些常量+1)。

        4
  •  0
  •   cube    14 年前

    因为后面的表达式 case 关键字必须是编译时常量,并且 m_var1 m_var2 阿伦特。如果需要进行此类测试,请使用 if 链。

    http://gcc.gnu.org/ml/gcc-help/2005-12/msg00069.html 谈论这个错误。

        5
  •  0
  •   Jens Gustedt    14 年前

    如错误消息所示,这些值必须是编译时常量。它们应该声明并定义为 const 在类声明中,这样编译器就可以在任何编译点(通常在头文件中)了解它们及其值。

    class ClsA {
    public:
       static unsigned short const m_var1 = 1001;
       static unsigned short const m_var2 = 1002;
    };
    

    在一些对象文件中,您还应该实例化这些 康斯特 变量

    unsigned short const ClsA::m_var1;
    unsigned short const ClsA::m_var2;
    

    即不重复初始化值,也不 static 关键字。