为什么枚举常量没有链接?

问题描述 投票:1回答:3

我试图了解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有外部联系。

LIVE DEMO

行为定义明确吗?您能否提供标准解释说明?

c enums language-lawyer extern
3个回答
2
投票

在6.2.2 4中,标准打算仅讨论对象和函数的标识符的链接,但它没有说明这一点。

枚举常量仅仅是值,而不是对象或函数,它们的标识符从不具有任何链接。

观察声明extern int a;声明a作为int对象的标识符。 int对象与int值不同,因此名为a的枚举常量不能与名为inta对象相同。因此,即使在考虑联系之前,extern int a;的声明也是无效的。


7
投票

声明为枚举常量的标识符的类型为int

这并不意味着它是int类型的变量

extern int a;

说有一个名为a的int类型的变量,这是与枚举常量的冲突


为什么枚举常量没有链接

出于同样的原因,常量123(也有int类型,但无论如何)也没有链接


2
投票

联系并不重要。在同一个编译单元中,您尝试使用两个相同的标识符,如果代码编译,则设想:

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.

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.