为了明确以下条款的措辞,请记住
external declaration
是在C语法中定义的(§6.9,
外部定义
translation-unit:
external-declaration
translation-unit external-declaration
external-declaration:
function-definition
declaration
所以程序文本(“翻译单元”)只是一系列外部定义。这与“外部联系”中使用“外部”一词无关。如该节第4段所述:
…预处理后的程序文本单元是一个翻译单元,它由一系列外部声明组成。它们被描述为外部的,因为它们出现在任何函数之外(因此具有文件范围)。
因此,限制§7.1.24问题中引用的内容适用于文件范围内的任何声明或定义(我不知道为什么标准上说“对外申报”
,因为外部定义集是外部声明的子集。但我看不出这个短语怎么能被解读为排除任何外部声明,哪怕是一个碰巧不是定义的声明。)
在Posix中,基本上相同的限制出现在系统接口第2章(一般信息)第2.2节(编译环境)末尾:
如果使用,应用程序应确保标头包含在任何外部声明或定义之外,并且应首先包含在对其定义的任何类型或宏,或对其声明的任何函数或对象的第一次引用之前。然而,如果在多于一个报头中声明或定义标识符,则在对标识符的初始引用之后可以包括第二和随后的关联报头。在包含头之前,应用程序不应定义任何名称在词汇上与该头定义的符号相同的宏。