【问题标题】:Is support of Annex K in C11 required for a conforming implementation?是否需要对 C11 中的附录 K 的支持才能实现符合要求?
【发布时间】:2013-05-18 00:32:47
【问题描述】:

虽然 answering a question 使用了一些我认为不是标准 C 的函数(sscanf_ssprintf_s),但 Daniel Fischer 让我注意到这些函数在附件 K 中定义。

我一般理解规范意味着它有助于定义标准。但是,传统上,C 标准的附件仅被视为提供信息。附录 K 在 C11 标准中被标记为规范性的。它定义了“安全”功能。

这是否意味着不提供这些函数的编译器不符合 C11 标准?

我只有 C11 标准草案,但它声明附件 K 是规范性的,但标准的库部分没有提及附件 K 中讨论的功能。 定义中的注释runtime-constraint 似乎暗示 Annex K 定义了一个扩展。

规范性附件是否仅定义可选扩展?

【问题讨论】:

  • 附件 D、F、G、K、L 均为 ISO/IEC 9899:2011 中的规范性内容。其他(A、B、C、E、H、I、J)信息丰富。

标签: c language-lawyer c11 tr24731


【解决方案1】:

附件 K 是可选的;它自己是这么说的。

见 K.2 第 2 段:

定义__STDC_LIB_EXT1__ 的实现应符合 本附件中的规格。

带脚注:

未定义__STDC_LIB_EXT1__ 的实现不需要遵守这些 规格。

第 3 段说:

子条款 K.3 应该像合并到并行 第 7 节命名子条款的结构。

这就是为什么没有必要在库部分第 7 条中提及它的原因(或者至少标准的作者认为没有必要)。

定义__STDC_LIB_EXT1__ 的实现必须将其定义为201112L; N1570 和发布的 C11 标准都有这个错误,但它已在技术勘误中得到修复。

【讨论】:

  • 谢谢。我浏览了其他规范性附件,发现它们都提供了一些宏来声明它们的可用性,除了附件 D。这是否意味着需要附件 D?
  • 是的,6.4.2.1,定义了标识符的语法,无条件参考附件D。
【解决方案2】:

从某种意义上说,它是“规范的”,即声称支持附件 K 的实现必须满足其中的要求。这不是强制性的。

【讨论】:

  • 那么使用仅在符合标准的附件中定义的功能编写的程序不是严格符合程序吗?
  • @user315052 "一个严格遵守的程序可以使用条件特性(见 6.10.8.3),前提是使用相关宏的适当的条件包含预处理指令来保护使用。"
  • @DanielFischer:明白了,谢谢。在看到 Keith Thompson 的回答后,我明白了这一点。
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多