6.9.1 一般规定
语法
形式化语法
bnf
translation-unit:
external-declaration
translation-unit external-declaration
external-declaration:
function-definition
declaration1
2
3
4
5
6
7
2
3
4
5
6
7
约束
- 在外部声明的声明说明符中,不得出现存储类说明符
register。 - 存储类说明符
auto只有在类型通过推导获得时,才可以出现在外部声明的声明说明符中。 - 对于在一个翻译单元内以内部链接声明的每个标识符,外部定义不得超过一个。
- 另外,如果一个以内部链接声明的标识符在表达式中被使用,那么该翻译单元中必须恰好有一个该标识符的外部定义;但以下情况除外:
- 它出现在
sizeof运算符的操作数中,且其结果是整数常量; - 它出现在
alignof运算符的操作数中,且其结果是整数常量; - 它出现在泛型选择的控制表达式中;
- 它出现在某个泛型关联的表达式中,且该表达式不是其泛型选择的结果表达式;
- 它出现在某个
typeof运算符的操作数中,且其结果不是变长修改类型。
语义
- 如
5.1.1.1所述,预处理之后的程序文本单位是翻译单元,它由一系列外部声明组成。 - 这些声明之所以称为“外部”,是因为它们位于任何函数之外,因此具有文件作用域。
- 如
6.7所述,一个声明如果还导致为由该标识符命名的对象或函数保留存储,那么它就是一个定义。 - 外部定义,是指同时又是函数定义(但不包括
inline定义)或对象定义的外部声明。 - 如果一个以外部链接声明的标识符在表达式中被使用,那么在整个程序中,该标识符必须恰好有一个外部定义;但若它只出现在以下上下文中,则最多一个即可:
typeof运算符的操作数中,且其结果不是变长修改类型;- 泛型选择的控制表达式中;
- 某个泛型关联的表达式中,且该表达式不是其泛型选择的结果表达式;
sizeof或alignof运算符的操作数中,且其结果是整数常量表达式。
注
如果一个以外部链接声明的标识符从未在表达式中使用,那么它不一定需要有外部定义。