根据标准,C++编译器需要对格式错误的程序做些什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

C ++ 03标准定义了格式良好的程序(1.3.14 [defns.well.formed])

一个根据语法规则构建的C ++程序,可诊断的语义规则和一个定义规则(3.2)

它进一步定义了一个不合格的程序(1.3.4 [defns.ill.formed])

输入到不是格式良好的程序的C ++实现(1.3.14)

并且该标准充满了诸如“如果X然后该程序不合格”(例如2.13.1 / 3)的陈述:

如果其中一个翻译单元包含不能由任何允许的类型表示的整数字面量,则该程序不合格。

然而我还没有找到C ++实现需要处理不合格的程序。

假设我有一个不健全的程序。怎么办?

当C ++实现遇到格式不正确的程序时,是否需要执行特定的操作,或者C ++实现行为是否未定义?

提问于
用户回答回答于

引用[intro.compliance]§2:

  • 如果程序没有违反本标准中的规则,则符合实施应在其资源限制内接受并正确执行该程序。
  • 如果程序包含违反任何可诊断规则或本标准中描述的构造发生的情况为“有条件支持”,而实现不支持该构造,则符合的实现应至少发出一条诊断消息。
  • 如果一个程序违反了不需要诊断的规则,本国际标准没有要求执行该程序。

我没有在标准中找到任何其他相关的段落。如果我们将其与[defns.undefined]结合使用:

未定义的行为 本国际标准对此没有要求的行为 [ 注:当本标准忽略任何行为的明确定义或程序使用错误构造或错误数据时,可能会出现未定义的行为。允许的未定义行为的范围从完全忽略情况而产生不可预知的结果,在翻译或程序执行期间以文档化的方式表现环境特征(发布或不发布诊断消息),终止翻译或执行(发布的诊断消息)。许多错误的程序结构不会产生未定义的行为; 他们需要被诊断。- 注意 ]

我想说,我们到达“发布诊断消息,并进一步行为是不确定的,”因为标准没有说更多关于它。

用户回答回答于

当C ++实现遇到格式不正确的程序时,是否需要执行特定的操作,或者C ++实现行为是否未定义?

如果标准没有另外指定,则实现应该发出诊断消息(错误或警告)。但是,对于某些违规行为,标准明确规定不需要诊断。在这种情况下,该程序不合格,但实现并不需要告诉用户 - 通常情况下,因为在一般情况下这样做太困难。

例如,关于“一个定义规则”,请参见C ++ 11标准的第3.2 / 4段:

每个程序应该包含该程序中odr使用的每个非内联函数或变量的一个定义; 不需要诊断

关于遇到违反规则时的实施要求,第1.4 / 2段规定:

[...] - 如果一个程序没有违反本国际标准中的规则,则符合实施应在其资源限制内接受并正确执行该程序。 - 如果程序包含违反任何可诊断规则或本标准中描述的构造发生的情况为“有条件支持”,而实现不支持该构造,则 符合实现应至少发出一条诊断消息。 - 如果一个程序违反了不需要诊断的规则,本国际标准没有要求实施该程序。

第1.4 / 1段也是相关的,它解释了上述段落中“ 可诊断规则 ”的含义:

这套可诊断规则由本国际标准中的所有句法和语义规则组成,除了那些包含“不需要诊断”或被描述为导致“未定义行为”的明确标记的规则。

扫码关注云+社区