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++实现行为是否未定义?
发布于 2013-04-04 15:56:20
当遇到格式错误的程序时,C++实现是否需要执行特定的操作,或者C++实现行为是否未定义?
如果标准未另行规定,则实现应发出诊断消息(错误或警告)。但是,对于某些违规行为,标准明确规定不需要诊断。在这种情况下,程序是病态的,但实现不需要告诉用户-通常是因为在一般情况下这样做太难了。
例如,关于One Definition规则,参见C++11标准的第3.2/4段:
每个程序应包含该程序中使用的每个非内联函数或变量的一个定义;不需要诊断。
关于遇到违反规则时的实施要求,第1.4/2段规定:
...
-如果程序不违反本国际标准中的规则,则符合要求的实现应在其资源限制内接受并正确执行该程序。
-如果程序违反了任何可诊断规则,或当实施不支持该构造时,出现了本标准中描述为“有条件支持”的构造,则一致性实施应发出至少一条诊断消息。
-如果程序包含不需要诊断的违反规则,则本国际标准对该程序的实现没有任何要求。
同样相关的是第1.4/1段,该段解释了上文引用的段落中“可诊断规则”的含义:
可诊断规则集由本国际标准中的所有语法和语义规则组成,但包含“不需要诊断”或被描述为导致“未定义的行为”的明确表示法的规则除外。
因此,总结一下:如果一个格式错误的程序包含一个可诊断的冲突,而标准没有明确规定“不需要诊断”,那么符合标准的实现应该发出诊断。
发布于 2013-04-04 15:55:08
引用intro.compliance§2:
我在标准中没有找到任何其他相关的段落。如果我们将其与defns.undefined结合使用
未定义的行为
本国际标准没有规定要求的行为
注意:如果本国际标准省略了行为的任何明确定义,或者程序使用了错误的构造或错误的数据,则可能会出现未定义的行为。允许的未定义行为的范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境的记录方式(具有或不具有诊断消息的发布)的行为,到终止转换或执行(具有诊断消息的发布)。许多错误的程序构造不会产生未定义的行为;它们需要进行诊断。-end笔记
我会说我们达到了“发出诊断消息,并且进一步的行为是未定义的”,因为标准没有更多地说明这一点。
发布于 2014-02-06 07:40:31
(首先,我为我的英语道歉)
标准,在§1.4.2中说:
如果程序包含违反任何可诊断规则的情况...一致性实现应至少发出一条诊断消息。
格式不良的程序的定义是“不是格式良好的程序”(§1.3.9),格式良好的程序是(§1.3.26):
根据语法规则、可诊断语义规则和One Definition规则构造的
C++程序
因此,一个格式错误的程序确实暗中违反了“某些”规则。如果规则R具有以下结构:
如果一个程序具有属性P,则它是一个格式错误的程序。
当程序具有这样的属性P时,它确实隐含地违反了规则(根据病态程序的定义),尽管不清楚哪个规则是被违反的,因为R本身没有(从严格的逻辑角度来看)。
https://stackoverflow.com/questions/15805394
复制相似问题