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

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

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

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

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

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

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

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

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

在脚注中立即得出结论:

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

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

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

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

在“7.26 Future library directions”中,您有一个可添加到标准标头的标识符列表,其中包括以strmem开头的标识符,以E开头的宏以及类似的内容。

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

嵌入式系统的编译器定期向标准头添加function和宏,通常是为了使特殊的处理器function可供使用。

如果我正确地阅读了标准,如果他们确实使用标准规定的保留名称,他们可以这样做而不会牺牲一致性。 由于符合程序可以使用任何非保留名称作为变量或函数名称,因此使用这样的非保留名称作为标准头的添加将破坏符合程序。

然而,在实践中,编译器编写者通常不会太在意。 如果您希望程序使用它们的实现,它们最多将提供为系统定义的元素列表,您可能不会使用这些元素。