【问题标题】:Is a compiler allowed to add functions to standard headers?允许编译器向标准头文件添加函数吗?
【发布时间】:2012-01-06 09:44:20
【问题描述】:

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

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

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

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

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

例如,假设它在 stdlib.h 中添加了非标准的 itoa。

【问题讨论】:

  • 我相信是的;我认为这是常见的做法。

标签: c header c99 standards


【解决方案1】:

嵌入式系统的编译器会定期将函数和宏添加到标准头文件中,通常是为了使特殊的处理器功能可供使用。

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

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

【讨论】:

  • 实际上,大多数编译器默认不完全符合 C 标准(C90 或 C99)。但他们中的大多数确实有一个选项或一组选项,这使他们(尝试)完全符合。例如,gcc -ansi -pedantic ...gcc -std=c99 -pedantic ...。请注意,gcc 的 C99 一致性为 not yet 100%
【解决方案2】:

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

符合标准的实现可能有扩展(包括额外的 库函数),只要它们不改变任何严格符合的行为 程序。

在脚注中直接得出结论:

这意味着一个符合规范的实现除了那些明确的之外不保留任何标识符 在本国际标准中保留。

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

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

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

【讨论】:

  • 我也读过,但我不认为脚注在 ISO 标准中是规范的?
  • 它们的名称不必以下划线开头。实际上,以下划线开头的标识符比不以下划线开头的标识符受到更严格的监管(有关保留标识符的概述,请参见 7.1.3)。
  • @Lundin:然后完全忽略脚注并考虑您可以添加哪些标识符不会破坏符合标准的程序。由于允许符合标准的程序创建标准尚未定义的 any 标识符(为实现保留的下划线除外),非脚注(规范)位就足够了回答你的问题。
  • @Lundin, @paxdiablo, 还有其他标准保留的标识符,例如所有以 str, IIRC 开头的标识符。
  • @SanderDeDycker:你倒退了。 应用程序在某些情况下被限制使用以下划线开头的标识符,但这是因为它们是为实现保留的。
【解决方案3】:

在“7.26 未来库方向”中,您有一个可以添加到标准标题的标识符列表,其中包括以strmem 开头的标识符、以E 开头的宏等等。

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

【讨论】:

  • (+1) but ... 标识符以str 和一个小写字母开头。
  • @undur_gongor,对,所以 stripisvalid 是保留的,但 strstrIPis_valid 不是。
猜你喜欢
  • 1970-01-01
  • 2019-04-21
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多