繁体   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