C ++ 03标准将格式良好的程序(1.3.14 [defns.well.formed])定义为
根据语法规则,可诊断语义规则和一个定义规则(3.2)构建的C ++程序
它进一步将格式错误的程序(1.3.4 [defns.ill.formed])定义为
输入到不是格式良好的程序的C ++实现(1.3.14)
并且标准中充满了诸如“如果X那么程序是格式错误”的陈述,例如(2.13.1 / 3):
如果某个程序的翻译单元中包含一个无法用任何允许类型表示的整数文字,则该程序格式不正确。
然而,我还没有找到使用不正确的程序需要C ++实现的内容。
假设我的程序格式不正确。现在怎么样?
C ++实现是否需要在遇到格式错误的程序时执行某些特定操作,或者C ++实现行为是否未定义?
答案 0 :(得分:11)
C ++实现是否需要在遇到格式错误的程序时执行某些特定操作,或者C ++实现行为是否未定义?
如果标准没有另外指定,则实现应发出诊断消息(错误或警告)。但是,对于某些违规,标准明确指定不需要诊断。在这种情况下,程序是不正确的,但是实现不需要告诉用户 - 通常,因为在一般情况下这样做会太困难。
关于一个定义规则,例如,见C ++ 11标准的第3.2 / 4段:
每个程序都应该包含每个非内联函数或odr使用的变量的一个定义 在该计划中; 无需诊断。
关于遇到违反规则时的实施要求,第1.4 / 2段规定:
[...]
- 如果某个程序不违反本国际标准中的规则,则符合实施要求 应在其资源限制内接受并正确执行该计划。
- 如果某个程序包含违反任何可诊断规则的行为或某个构造中出现的构造 当实现不支持该构造时,此标准为“有条件支持”, 符合要求的实施应至少发出一条诊断信息。
- 如果某个程序违反了不需要诊断的规则,则为本国际 标准对该程序的实施没有要求。
第1.4/1段也是相关的,它解释了上面引用的段落中“可诊断规则”的含义:
可诊断规则集由本国际标准中的所有句法和语义规则组成,除外 对于包含“无需诊断”或描述为“无需诊断”的明确表示法的规则 导致“未定义的行为。”
总而言之:如果格式错误的程序包含可诊断的违规,标准没有明确指定“无需诊断”,那么符合要求的实现应该发出诊断信息。
答案 1 :(得分:4)
引用[intro.compliance]§2:
如果某个程序不违反本国际标准中的规则,则符合规定的实施应在其中 资源限制,接受并正确执行该程序。
如果程序包含违反任何可诊断规则或本标准中描述的构造的发生 当实施不支持时,“有条件支持” 该构造,符合要求的实施应至少发布一个 诊断信息。
如果某个程序违反了不需要诊断的规则,则本国际标准不要求 与该计划有关的实施。
我没有在标准中找到任何其他相关段落。如果我们将它与[defns.undefined]结合起来:
未定义的行为
本国际标准没有要求的行为
[注意:此国际版可能会出现未定义的行为 标准省略了行为或程序的任何明确定义 使用错误的构造或错误的数据。允许的未定义 行为的范围从完全忽略情况 不可预知的结果,在翻译或程序期间表现 以文件化的方式执行环境特征 (有或没有发出诊断信息),终止 翻译或执行(发布诊断 信息)。许多错误的程序结构不会产生未定义的 行为;他们需要被诊断出来。 -end note ]
我会说我们到达“发出一条诊断信息并且行为未定义”,因为该标准没有详细说明。
答案 2 :(得分:2)
(首先,对不起我的英语)
标准,在§1.4.2中说:
如果程序包含违反任何可诊断规则的情况,则符合要求的实施方案应至少发出一条诊断消息。
不正确的程序的定义是“程序不完善”(§1.3.9),而且格式良好的程序是(§1.3.26):
根据语法规则,可诊断语义规则和单一定义规则构建的C ++程序
因此,一个不正确的程序会隐含地违反“某些”规则。如果规则R具有以下结构:
如果某个程序具有属性P,则它是一个格式错误的程序。
当程序具有此类属性P时,它会隐式违反规则(通过定义不正确的程序),尽管不清楚哪个规则是被违反的规则,因为R本身不会(从严格的逻辑角度来看)。
答案 3 :(得分:1)
我能找到的唯一相关引用说,需要一个实现来诊断一个格式错误的程序,但它可以完成编译:
8)符合要求的实施可能有扩展(包括附加 库函数),只要它们不改变任何行为 良好的计划。诊断程序需要实现 根据这种情况使用不正确的扩展 国际标准。但是,这样做,他们可以编译和 执行这样的程序。