【发布时间】:2019-06-21 04:54:16
【问题描述】:
我试图了解enumeration constants 的链接,但在标准N1570 中找不到明确的答案。 6.2.2(p6):
以下标识符没有链接:声明为的标识符 不是对象或函数;声明的标识符 成为函数参数;对象的块范围标识符 声明时没有存储类说明符
extern。
所以我需要了解常量不是对象。对象定义为3.15:
执行环境中的数据存储区域,内容为 可以表示值
还有6.2.2(p4)(强调我的):
对于使用存储类说明符 extern 声明的标识符 该标识符的先前声明可见的范围,31) 如果先前的声明指定了内部或外部链接,则 在后面的声明中标识符的链接与 在先前声明中指定的链接。 如果没有事先声明 可见,或者如果前面的声明没有指定链接,那么 标识符有外部链接。
无论如何6.4.4.3(p2):
声明为枚举常量的标识符的类型为
int。
结合所有我不明白的原因
enum test {
a = 1
};
extern int a; //compile-error. UB?
不编译?我希望a 有外部链接。
行为是否明确?您能否提供参考标准来解释这一点?
【问题讨论】:
-
你的问题没有任何意义。你只是尝试在同一个编译单元中有两个相同的符号。
-
@P__J__ 你的问题没有任何意义 为什么?我提供了行为并询问了它的解释?它是明确定义/未定义/未指定的行为吗?
-
它和
int a; extern int a;一样,为什么不编译。在一个编译单元中完全相同的两个相同符号。它与链接没有任何共同之处。 -
某物可以有一个标识符而不是一个对象。枚举常量与整数常量
123和字符常量'A'属于同一类别。 -
@SomeName 如果您不同意,您需要编写自己的编译器。
标签: c enums language-lawyer extern