C 和 C++ 标准如何告诉您处理它们未涵盖的情况?

问题描述 投票:0回答:0

众所周知,在每个 C 和 C++ 标准中都存在“盲点”,这些“盲点”没有描述格式良好的程序中的某些情况。显然,在如此复杂的形式系统的非形式化描述中,不可能提前注意到一切。

因此,在发布新的修订版(“版本”)之前,有一个纠正和解释标准的既定程序。让我们使用最简单且按时间顺序排列的第一个示例来考虑此过程 - C90 标准 (ISO/IEC 9899:1990)。

为此发布了以下类型的文件,按重要性递减排列:

  1. ISO 技术勘误表 (TC)

    事实上,这些是一种直接应用于现有标准并具有追溯效力的“补丁”。实际上,这意味着,如果新文档以其他方式澄清了这些地方,那么所有以前以自己的方式解释标准模糊部分的合规实现都会变得不合规。

    对于 C90,发布了两个此类文档:TC-1:1994TC-2:1996

  2. ISO 修正案 (Amd),又名 ISO 规范附录 (NA)

    与 TC 的效果非常相似,并且实际上具有相同的影响,但可能通过某种机制限制其追溯效果 - 例如通过引入新值

    __STDC_VERSION__

    通常,ISO 修正案意义重大且规模庞大,因此很少发布。但对于 C90,仍然发布了 - Amd-1:1995

  3. WG14 缺陷报告(DR)

    这些是致标准化委员会的信函,要求澄清标准中某些有争议的段落,并提请注意标准中的各种缺陷。委员会对这些问题进行讨论,公开表达其集体意见,最终可能会出现在正式批准的文件中(TC、NA 甚至标准本身)。

    但是,缺陷报告本身并不是正式文件,因此不具有强制性追溯效力。尽管如此,实施者和普通开发人员可以依靠它们来避免未来不合格的命运,或者至少减少其发生的可能性。

    对于C90标准,包括所有上述补充内容,已处理了178份报告,其列表可在委员会的官方网站上找到:
    https://www.open-std.org/jtc1/sc22/wg14/www/docs/dr.htm
    https://www.open-std.org/jtc1/sc22/wg14/www/docs/c90_drs.html


由于标准既不为编译器也不为标准库提供参考(模型)实现,因此需要不断澄清和编辑。并非所有实施者都可能有兴趣完全支持新标准,也并非所有开发人员都希望重写他们维护的旧代码 - 这是生活和商业的事实。但也很明显,TC和DR不能无限地为旧标准颁发。

因此,出现以下问题:

  1. 如何处理未明确声明为“实现定义”、“未指定”甚至“未定义”的未指定行为? 在这种情况下是否应该使用更新的标准?

  2. 撤销的标准是否应该提交缺陷报告?
  3. 请注意,我不仅谈论编译器和标准库程序员,还谈论常规代码编写者。
  4. C89 标准是为了描述一系列已经使用的方言而编写的,其中一些方言指定了其他方言未指定的情况下的行为。该标准并没有试图全面描述使语言适合这些方言所服务的任何特定目的所需的一切,而是将其自身限制在所有 C 方言所共有的方面。在编写该标准时,存在大量为实现而编写的程序,这些程序将“以环境的记录方式特征”处理某些构造,以某种有用的方式记录构造行为的目标环境,同时因为有为其他平台编写的实现没有指定此类行为。该标准并没有强制要求所有实现都必须模仿常见的行为,或者所有符合标准的程序都必须克服困难以适应一些晦涩的实现的限制,而是简单地放弃管辖权,假设寻求出售实现的人会做出善意的行为。努力使它们对客户有用。

c++ c language-lawyer standards iso
© www.soinside.com 2019 - 2024. All rights reserved.