【问题标题】:External definition of an object declared with external linkage使用外部链接声明的对象的外部定义
【发布时间】:2020-04-22 14:59:23
【问题描述】:

我对@9​​87654321@ 的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


【解决方案1】:

见 C11 §6.2.2 Linkages of identifiers:

……共有三种链接:外部链接、内部链接和无链接。

在构成整个程序的翻译单元和库集合中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元中,具有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明都表示一个唯一的实体。

如果对象或函数的文件范围标识符的声明包含存储类说明符 static,则该标识符具有内部链接

已添加重点。

如果使用static 指定文件范围变量,则它具有内部链接,并且与讨论具有外部链接的变量无关。

【讨论】:

  • 如果不是标识符应该有一个确切的外部定义,那不是更清楚吗标识符表示同一个实体?或者是多余的?
  • 我会说多余的话是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多