为什么“switch-case”将#define'd标识符视为常量但不是const限定变量?

时间:2013-04-26 12:11:59

标签: c switch-statement const c-preprocessor

此程序产生以下错误:

  

案例标签不会减少为整数常量|

我根本无法理解为什么显式声明的常量third_cond,指定的初始值设定项3,在函数体内部,也不被视为case 3的常量而{{1}标识符#define同时被视为常量。如果我使用文字second_value代替3或仅third_cond {{1作为#define。请解释为什么会这样,除非这个问题是重复的。我查了一下,但没有找到答案。

third_cond

2 个答案:

答案 0 :(得分:9)

在C const中并不代表常数而是只读。 const限定变量永远不是常量,不能在需要常量表达式的地方使用。

请注意,您还可以将enum常量用于case常量表达式,因为enum常量是实常数。

答案 1 :(得分:1)

常量实际上是一个值:"string constant"1L0.50xAF,...

您可以使用enum

定义自己的常量
enum
{
    MY_CONSTANT_1,
    MY_CONSTANT_2,
    /* ... */
}

switch-case等待可以转换为int的常量(enumintlong,...)。

#define声明一个宏,因此在编译时,second_cond会被2取代,这是一个常量。

但是third_cond仍然是一个变量,一个只读变量(因为const),所以,不能保证它的值保持不变(即使存在{{1}它只将标识符标记为只读,而不是关联的内存。