C++ 什么是C++;根据标准,编译器需要处理格式错误的程序吗?

C++ 什么是C++;根据标准,编译器需要处理格式错误的程序吗?,c++,compiler-construction,language-lawyer,C++,Compiler Construction,Language Lawyer,C++03标准将格式良好的程序(1.3.14[defns.well.formed])定义为 一个根据语法规则、可诊断语义规则和一个定义规则(3.2)构造的C++程序 它进一步将格式错误的程序(1.3.4[定义错误的格式])定义为 对C++实现的输入,它不是一个格式良好的程序(1.3.14)< /P> 标准中充满了诸如“如果X,则程序格式错误”之类的语句,例如(2.13.1/3): 如果程序的一个翻译单元包含不能由任何允许的类型表示的整数文本,则该程序是格式错误的 但我还没有找到C++实现对不完善

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

一个根据语法规则、可诊断语义规则和一个定义规则(3.2)

构造的C++程序 它进一步将格式错误的程序(1.3.4[定义错误的格式])定义为

对C++实现的输入,它不是一个格式良好的程序(1.3.14)< /P> 标准中充满了诸如“如果X,则程序格式错误”之类的语句,例如(2.13.1/3):

如果程序的一个翻译单元包含不能由任何允许的类型表示的整数文本,则该程序是格式错误的

<>但我还没有找到C++实现对不完善的程序所需要的。

假设我有一个格式错误的程序。现在怎么办


是在遇到一个不正确的程序时,做特定的事情的C++实现,还是C++实现行为,它是未定义的?

,我只能找到一个相关的引用来诊断一个不正确的程序,但是它可以完成编译:

1.4实施合规性[简介合规性] 8) 一致性实施可具有扩展(包括附加 库函数),前提是它们不会改变任何 格式良好的程序。诊断程序需要实现 根据这一点,使用格式不正确的扩展 国际标准。但是,这样做之后,他们就可以编译 执行这样的程序


引用[合规性简介]§2:

  • 如果程序不违反本国际标准中的规则,则一致性实施应在其范围内进行 资源限制,接受并正确执行该程序

  • 如果程序违反了任何可诊断规则或出现了本标准中描述为 实现不支持时的“有条件支持” 对于该构造,一致性实现应至少发布一个 诊断信息

  • 如果程序违反了无需诊断的规则,则本国际标准不要求 与该程序相关的实现

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

未定义的行为

本国际标准不要求的行为

[注:当发生这种情况时,可能会出现未定义的行为 标准省略了行为的任何明确定义,或者当程序 使用错误的构造或错误的数据。允许的未定义 行为范围从完全忽略情况到 不可预测的结果,翻译或编程过程中的行为 以环境特有的文件化方式执行 (无论是否发出诊断信息),终止 翻译或执行(通过发布诊断文件) 许多错误的程序构造不会产生未定义的 行为;需要对其进行诊断。-尾注]

我要说的是,我们得出了“发出诊断信息,而且行为还未定义”的结论,因为该标准没有更多地说明这一点

是当遇到一个不正确的程序时,需要执行特定的C++实现,还是C++实现行为不明确?

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

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

每个程序应包含odr使用的每个非内联函数或变量的精确定义 在该计划中无需诊断

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

[……]

-如果程序不违反本国际标准中的规则,则为一致性实施 应在其资源范围内接受并正确执行该程序

-如果程序包含违反任何可诊断规则的行为或出现了中描述的构造 当实现不支持该构造时,此标准被视为“有条件支持”, 一致性实施应发出至少一条诊断信息

-如果某个程序违反了不需要诊断的规则,则本国际标准 标准对该程序的实现没有任何要求

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

可诊断规则集由本国际标准中的所有语法和语义规则组成,除了 对于包含“无需诊断”或描述为 导致“未定义的行为”。

总而言之:如果一个格式错误的程序包含一个可诊断的违规行为,而标准没有明确规定“无需诊断”,那么符合标准的实现应该发出一个诊断。

(首先,对不起我的英语)

该标准在§1.4.2中规定:

如果程序包含违反任何可诊断规则的内容[…],则会导致混淆