我已阅读C99标准6.9.3中的以下规则
翻译单元中使用内部链接声明的每个标识符不得超过一个外部定义。此外,如果在表达式中使用通过内部链接声明的标识符(除了作为sizeof运算符的操作数的一部分,其结果是整数常量),则转换单元中的标识符应该只有一个外部定义。
我的问题:
(1)外部定义究竟是什么?
(2)为什么以下代码不违反此规则?
static int a = 1;
int main()
{
a += 1;
return 0;
}
答案 0 :(得分:3)
我认为您将外部定义与使用extern
关键字的定义混淆。
该定义在C9 / C11中以6.9的语义部分编写:
这些被描述为“外部”,因为它们出现在任何外部 功能(因此有文件范围)。
在您的示例中,代码不违反规则,因为您只有一个具有内部链接的对象的外部定义,即:
static int a = 1;