为什么枚举常量没有链接?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么枚举常量没有链接?相关的知识,希望对你有一定的参考价值。
我试图了解enumeration constant
s的联系,但在标准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
有外部联系。
行为定义明确吗?您能否提供标准解释说明?
在6.2.2 4中,标准打算仅讨论对象和函数的标识符的链接,但它没有说明这一点。
枚举常量仅仅是值,而不是对象或函数,它们的标识符从不具有任何链接。
观察声明extern int a;
声明a
作为int
对象的标识符。 int
对象与int
值不同,因此名为a
的枚举常量不能与名为int
的a
对象相同。因此,即使在考虑联系之前,extern int a;
的声明也是无效的。
声明为枚举常量的标识符的类型为int
这并不意味着它是int类型的变量
但
extern int a;
说有一个名为a的int类型的变量,这是与枚举常量的冲突
为什么枚举常量没有链接
出于同样的原因,常量123(也有int类型,但无论如何)也没有链接
联系并不重要。在同一个编译单元中,您尝试使用两个相同的标识符,如果代码编译,则设想:
enum test {
a = 1
};
extern int a;
int b = a; // which `a`? a as the external variable or `a` as a constant? How to decide.
以上是关于为什么枚举常量没有链接?的主要内容,如果未能解决你的问题,请参考以下文章