具有内部链接的标识符的外部定义

时间:2016-04-30 13:37:51

标签: c c99 linkage

我已阅读C99标准6.9.3中的以下规则

  

翻译单元中使用内部链接声明的每个标识符不得超过一个外部定义。此外,如果在表达式中使用通过内部链接声明的标识符(除了作为sizeof运算符的操作数的一部分,其结果是整数常量),则转换单元中的标识符应该只有一个外部定义。

我的问题:

(1)外部定义究竟是什么?

(2)为什么以下代码不违反此规则?

static int a = 1;

int main()
{
    a += 1;
    return 0;
}

1 个答案:

答案 0 :(得分:3)

我认为您将外部定义与使用extern关键字的定义混淆。

该定义在C9 / C11中以6.9的语义部分编写:

  

这些被描述为“外部”,因为它们出现在任何外部   功能(因此有文件范围)。

在您的示例中,代码不违反规则,因为您只有一个具有内部链接的对象的外部定义,即:

static int a = 1;