对于类似以下内容的定义行为是什么?
#include <stdio.h>
typedef enum {
ENUM_VAL_1 = 1,
ENUM_VAL_2 = 2
} TEST_ENUM;
int main() {
TEST_ENUM testVar1 = ENUM_VAL_1;
TEST_ENUM ENUM_VAL_1 = ENUM_VAL_1;
TEST_ENUM testVar2 = ENUM_VAL_1;
printf("ENUM_VAL_1 = %u\n",ENUM_VAL_1);
printf("testVar1 = %u\n",testVar1);
printf("testVar2 = %u\n",testVar2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从我对GCC和MSVC编译器的测试来看,这样做的行为是testVar1将被设置为等于枚举值"ENUM_VAL_1"或1.然而,下一个语句将尝试将变量ENUM_VAL_1设置为等于其自己的值,当然是当前未初始化并因此是垃圾,而不是将变量ENUM_VAL_1设置为等于枚举值ENUM_VAL_1.然后,当然,testVar2也将获得与变量ENUM_VAL_1相同的垃圾值.
根据C标准定义的行为是什么,还是这种未定义的行为?无论是否定义,我猜这种类型的例子至少是不好的做法,因为它含糊不清.
谢谢!
根据C标准(6.2.1标识符范围)
- ...如果标识符指定同一名称空间中的两个不同实体,则范围可能会重叠.如果是这样,一个实体(内部范围)的范围将严格地在另一个实体(外部范围)的范围之前结束.在内部范围内,标识符指定在内部范围内声明的实体; 在外部作用域中声明的实体在内部作用域内隐藏(并且不可见).
和
7结构,联合和枚举标记的范围在声明标记的类型说明符中标记出现之后开始.每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围.任何其他标识符的范围都在其声明者完成之后开始
所以在这个宣言中
TEST_ENUM ENUM_VAL_1 = ENUM_VAL_1;
Run Code Online (Sandbox Code Playgroud)
声明ENUM_VAL_1符在sign =之前被认为已完成.所以它隐藏了枚举器.
实际上它是自己初始化的,并且具有不确定的价值.
这同样适用于C++(3.3.2声明点)
1名称的声明点紧接其完整的声明者(第8条)之后和初始化者之前(如果有的话),除非如下所述.[例如:
int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)
这里第二个x用它自己的(不确定的)值初始化. - 末端的例子]