【发布时间】:2020-04-22 14:59:23
【问题描述】:
我对@987654321@ 的N2310 C18 中的措辞有点困惑:
如果使用外部链接声明的标识符用于 表达式(作为
sizeof或_Alignof的操作数的一部分除外 结果是整数常量的运算符),在整个 程序应该有一个确切的一个外部定义 标识符;否则,不得超过一个。 164)
问题:从这句话中是否可以明显看出程序中某处的外部定义(如果有)也应该声明一个具有外部链接的标识符?
正如我所强调的,在整个程序的某个地方,标识符应该只有一个外部定义。它没有指定定义应该使用哪个链接来声明标识符。示例:
tu1.c:
int a = 10;
tu2.c:
static int a = 20;
正式地说,我们在tu1.c 中声明了标识符a 的一个外部定义,在tu2.c 中声明了另一个定义,因此我们可以将上面引用的引用应用于此示例。
虽然要表示在不同中声明的相同实体标识符,但都应使用6.2.2/2中指定的外部链接声明:
在构成一个翻译单元和库的集合中 整个程序,每个声明一个特定的标识符 外部链接表示相同的对象或函数。
这里不是这样。
【问题讨论】:
-
据我了解,
tu2.c中的static int a = 20;行没有 将a声明为具有外部链接。相反,它具有显式“本地”链接。还是我错过了重点? (这并不罕见。) -
@AdrianMole —“本地链接”的正确(标准)术语是“内部链接”。
-
我的解释是你的第一个引用中的措辞有点草率,他们的意思是“应该有一个外部定义与标识符的外部链接”,即你在
tu2.c中的定义没有导致未定义的行为 -
@M.M 好点。具有内部链接的标识符的定义不提供具有外部链接的标识符的定义(即使具有相同的名称)。
标签: c language-lawyer declaration definition linkage