C++ 开关:情况<一些常数> - 这是允许的吗?

C++ Switch: case <some constant> - is this allowed?

本文关键字:常数 情况 开关 lt C++ gt      更新时间:2023-10-16

我正在尝试执行以下操作:

    switch(moveDirection){
        case MOVE_DIRECTION_UP:
            //do something
        break;
    }

MOVE_DIRECTION_UP在哪里:

    const unsigned char MOVE_DIRECTION_UP = 0x0;

编译器给出错误:MOVE_DIRECTION_UP不能出现在常量表达式中

当然,这应该是允许的,因为如果我用0x0替换MOVE_DIRECTION_UP,它可以很好地编译。

任何帮助不胜感激,谢谢!

如果您正在使用 C++11,则可以将MOVE_DIRECTION_UP声明为 constexpr 。编译器会将其视为可用作开关标签的常量值。

如果不是,则可以定义枚举:

namespace eDirection { enum e {
    UP = 0x0,
    DOWN = 0x1
};}
switch( direction ) {
    case eDirection::UP: ...
};

在C++中是允许的。您的代码是正确的。const变量可以在常量表达式中使用。

您确定要构建的是C++源文件而不是 C 文件吗?在 C 中,代码无效(const变量不能在常量表达式中使用。

这似乎是编译器错误。

在C++98:

5.19 常量表达式

一个整数常量表达式只能涉及文字(2.13),枚举器、常量变量或静态变量初始化的整型或枚举类型的数据成员常量表达式 (8.5)

在第 C++11 中:

5.19 常量表达式

2 条件表达式是核心常量表达式,除非它涉及以下之一作为潜在评估的子表达式

— 左值到右值的转换 (4.1),除非它适用于

整数或枚举类型的 gl值,指的是非易失性具有前面初始化的 const 对象,使用常量表达式,或

您没有提供演示问题的实际程序,所以我将使用水晶球。 您转发声明了您的 const,其值在交换机上不直接可见。