是否允许编译器向标准头添加函数?

Lun*_*din 7 c standards header c99

是否允许C编译器向标准头添加函数并仍然符合C标准?

我在某处读到了这个,但除了附件J.5外,我在标准中找不到任何参考:

包含任何可能导致严格符合程序无效的扩展会导致实现不一致.此类扩展的示例包括新关键字,标准标头中声明的额外库函数或名称不以下划线开头的预定义宏.

但是,附件J是信息性的而不是规范性的...所以它没有帮助.

所以我想知道一个符合标准的编译器是否可以在标准头文件中添加额外的功能?

例如,假设它将非标准itoa添加到stdlib.h中.

und*_*gor 12

在4."一致性"§6中,有:

符合实现的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为.

在脚注中立即得出结论:

这意味着符合要求的实施不保留本国际标准中明确保留的标识符以外的标识符.

保留的标识符在7.1.3中描述.基本上,它是以下划线开头的一切,并且明确列出的所有内容都用于标准库.

所以,是的,允许编译器添加扩展.但是它们的名称必须以下划线或为库保留的前缀之一开头.

itoa 不是保留标识符,并且在标准头中定义它的编译器不符合.

  • @Lundin:然后完全忽略脚注并考虑你可以添加哪些标识符,这些标识符不会破坏一致的程序.由于允许符合程序创建尚未由标准定义的_any_标识符(除了为实现保留的下标之外),非脚注(规范)位足以回答您的问题. (5认同)
  • @SanderDeDycker:你倒退了.在某些情况下,**应用程序**仅限于使用以下划线开头的标识符,但这是因为它们是为实现保留的. (2认同)

Jen*_*edt 5

在"7.26未来库方向"中,您有一个可添加到标准标题的标识符列表,其中包括以strmem开头的标识符,以及以此E类似的宏开头的标识符.

除此之外,实现仅限于"7.1.3保留标识符"中保留的通用名称.