后续问题:clang: <string literal> + <expression returned int> 导致令人困惑的警告:将 'int' 添加到字符串不会附加到字符串。
“严格符合程序”+没有扩展是否意味着“没有发出诊断”?
原因:更好地理解术语“严格符合程序”。
后续问题:clang: <string literal> + <expression returned int> 导致令人困惑的警告:将 'int' 添加到字符串不会附加到字符串。
“严格符合程序”+没有扩展是否意味着“没有发出诊断”?
原因:更好地理解术语“严格符合程序”。
即使程序符合要求,实现也可能会生成诊断。
C 标准的第 5.1.1.3p1 节关于诊断状态:
如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的行为,则符合的实现应产生至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现-定义。在其他情况下不需要生成诊断消息。9)
- 目的是实现应该识别每个违规的性质,并在可能的情况下进行本地化。 当然,只要一个有效的程序仍然被正确翻译,一个实现就可以自由地产生任意数量的诊断。 它还可能成功翻译无效程序
脚注 9 中的粗体部分指出可能会产生额外的诊断。
“严格符合程序”+ 没有扩展 == 没有发出诊断信息吗?
不。
语言规范要求发出诊断的唯一内容是无效语法和约束违规:
如果预处理翻译单元或翻译单元包含违反任何语法规则或约束的行为,则符合的实现应产生至少一个诊断消息(以实现定义的方式标识),即使该行为也明确指定为未定义或实现-定义。 在其他情况下不需要生成诊断消息。
(C2017,5.1.1.3/1;强调添加)
根据定义,一个严格符合的程序只展示有效的语法并且不包含任何违反约束的行为,因此规范不要求符合的实现在出现这样的程序时发出任何诊断。
然而,规范并没有禁止实现发出除所需诊断之外的诊断,并且大多数实现在某些情况下会发出不需要的诊断。正如脚注 9 所阐明的那样,规范允许这样做,其中部分内容是:
当然,只要一个有效的程序仍然被正确翻译,一个实现就可以自由地产生任意数量的诊断。
另请注意,“'严格符合程序' + 无扩展”是多余的。使用任何语言扩展的程序可能符合,但并不严格符合:
严格遵守的程序应仅使用本国际标准中指定的语言和库的那些特性。它不应产生依赖于任何未指定、未定义或实现定义的行为的输出,并且不应超过任何最小实现限制。
(C2017 4/5;强调添加)