sha*_*oth 21 c++ compiler-construction language-lawyer
C++ 03 Standard将格式良好的程序(1.3.14 [defns.well.formed])定义为
根据语法规则,可诊断的语义规则和一个定义规则(3.2)构建的C++程序
它进一步定义了一个不正常的程序(1.3.4 [defns.ill.formed])as
输入到不是格式良好的程序的C++实现(1.3.14)
并且标准中充满了诸如"如果X那么程序是格式错误"的陈述,例如(2.13.1/3):
如果某个程序的翻译单元中包含一个无法用任何允许类型表示的整数文字,则该程序格式不正确.
然而,我还没有找到C++实现对于格式错误的程序需要做些什么.
假设我有一个不正确的程序.怎么办?
C++实现是否需要在遇到格式错误的程序时执行某些特定操作,或者C++实现行为是否未定义?
And*_*owl 11
C++实现是否需要在遇到格式错误的程序时执行某些特定操作,或者C++实现行为是否未定义?
如果标准没有另外指定,则实现应发出诊断消息(错误或警告).但是,对于某些违规,标准明确指定不需要诊断.在这种情况下,程序格式不正确,但实现不需要告诉用户 - 通常,因为在一般情况下这样做会太困难.
例如,关于单一定义规则,请参阅C++ 11标准的第3.2/4段:
每个程序应该只包含该程序中使用的每个非内联函数或变量的一个定义; 无需诊断.
关于在遇到违反规则时的实施要求,第1.4/2段规定:
[...]
- 如果某个程序不违反本国际标准中的规则,则符合要求的实施应在其资源限制内接受并正确执行该程序.
- 如果程序包含违反任何可诊断规则或在本标准中描述为"有条件支持"的构造的发生,当实现不支持该构造时, 符合要求的实现应发出至少一条诊断消息.
- 如果某个程序包含违反不需要诊断的规则,则本国际标准不对该程序的实施提出任何要求.
第1.4/1段也是相关的,它解释了上文引用的段落中" 可诊断规则 "的含义:
可诊断规则集包含本国际标准中的所有语法规则和语义规则,但那些包含"无需诊断"的明确表示法或被描述为导致"未定义行为"的规则除外.
总而言之:如果格式错误的程序包含可诊断的违规,标准没有明确指定" 无需诊断 ",那么符合要求的实现应该发出诊断信息.
我能找到的唯一相关引用说,需要一个实现来诊断格式错误的程序,但它可以完成编译:
8) 一致的实现可以具有扩展(包括附加的库函数),只要它们不改变任何格式良好的程序的行为。根据本国际标准,需要实施来诊断使用此类格式错误的扩展的程序。然而,这样做之后,他们可以编译并执行此类程序。