C 使用外部链接声明的对象的外部定义

C 使用外部链接声明的对象的外部定义,c,language-lawyer,declaration,definition,linkage,C,Language Lawyer,Declaration,Definition,Linkage,我对N2310的6.9 p5中的措辞有点困惑: 如果在 表达式(作为sizeof或\u Alignof 运算符,其结果是整数常量),在整个 程序应准确地一个外部定义 标识符;否则,不得超过一个。164) 问题:从这段引文中是否可以明显看出,程序中的某个外部定义(如果有)也应该声明一个带有外部链接的标识符 正如我强调的那样,在整个程序中的某个地方,标识符应该只有一个外部定义。它没有指定定义应该用哪个链接声明标识符。例如: tu1.c: int a = 10; static int a = 20;

我对N2310的
6.9 p5
中的措辞有点困惑:

如果在 表达式(作为
sizeof
\u Alignof
运算符,其结果是整数常量),在整个 程序应准确地一个外部定义 标识符;否则,不得超过一个。164)

问题:从这段引文中是否可以明显看出,程序中的某个外部定义(如果有)也应该声明一个带有外部链接的标识符

正如我强调的那样,在整个程序中的某个地方,标识符应该只有一个外部定义。它没有指定定义应该用哪个链接声明标识符。例如:

tu1.c

int a = 10;
static int a = 20;
tu2.c

int a = 10;
static int a = 20;
正式地说,我们在
tu1.c
中声明了标识符
a
的一个外部定义,在
tu2.c
中声明了另一个外部定义,因此我们可以将上面引用的引用应用于本例

虽然要表示以不同方式声明的相同实体标识符,应按照
6.2.2/2
中的规定使用外部链接声明:

在一组翻译单元和库中,构成 整个程序,每个特定标识符的声明 外部链接表示相同的对象或功能

这里的情况并非如此。

参见C11:

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

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

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

重点补充


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

据我所知,行
static int a=20tu2.c
中的code>未声明
a
具有外部链接。相反,它有明确的“本地”联系。还是我没抓住重点?(这并不罕见。)@AdrianMole“本地链接”的正确(标准)术语是“内部链接”。我的解释是,您第一次引用的措辞有点马虎,它们的意思是“标识符应有一个带有外部链接的外部定义”,即,
tu2.c
中的定义不会导致未定义behaviour@M.M说得好。具有内部链接的标识符的定义不提供具有外部链接的标识符的定义(即使具有相同的名称)。如果标识符应该只有一个外部定义,而不是只有一个外部定义来表示同一实体,这不是更清楚吗?或者它是多余的?我会说多余的词是多余的。