0

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

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

MOVE_DIRECTION_UP 是这样的:

    const unsigned char MOVE_DIRECTION_UP = 0x0;

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

当然应该允许这样做,因为如果我将 MOVE_DIRECTION_UP 替换为 0x0,它编译得很好。

任何帮助表示赞赏,谢谢!

4

4 回答 4

2

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

如果不是,您可以定义一个枚举:

namespace eDirection { enum e {
    UP = 0x0,
    DOWN = 0x1
};}

switch( direction ) {
    case eDirection::UP: ...
};
于 2012-12-01T12:18:00.613 回答
1

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

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

于 2012-12-01T12:22:24.207 回答
0

这似乎是一个编译器错误。

在 C++98 中:

5.19 常量表达式

...

一个整数常量表达式只能包含文字 (2.13)、枚举数、常量变量或整数或枚举类型的静态数据成员,这些成员使用常量表达式 (8.5) 初始化

在 C++11 中:

5.19 常量表达式

...

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

...

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

整数或枚举类型的左值,它引用具有前面初始化、用常量表达式初始化的非易失性 const 对象,或

于 2012-12-01T12:28:26.187 回答
0

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

于 2012-12-01T15:43:20.723 回答