[英]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.