如果C++编译时已经需要遵守C++标准,那么g++的-pedantic标志有什么意义?

3

我不理解 g++ 的 -pedantic 标志的意义。

代码默认编译时不遵循 C++ 标准吗?

如果我添加或者不添加这个标志,编译器逻辑上应该会发出相同的警告,对吗?


1
G++在默认情况下打开了一些不属于标准的扩展,这并不是独一无二的。有时会引起混淆:有很多问题最终都归结为这个问题,因为G++默认打开了可变长度数组。但这仍然是事实。 - Nathan Pierson
2
两个词:向后兼容。更多的话:在C++标准化之前就有了C++编译器,因此存在着预标准代码的C++代码库,并且许多这样的代码库被允许继续编译。 - NathanOliver
再说两句:商业上的便利。如果我使用的编译器在我写出未定义语句时吞掉了我的猫,比如 unsigned n = -1e1;,我就会换另一个供应商。 - Bathsheba
2个回答

5
如果我添加这个标志或者不添加,编译器应该逻辑上发出相同的警告,对吗?
不是的,编译器通常默认使用带有扩展和与标准相对较小差异的C++变体。例如,GCC默认支持可变长度数组。根据标准,这些是非法的,因此GCC应该为它们生成诊断信息。-pedantic可以做到这一点。
要最接近标准符合性,您需要在GCC上使用-std=c++XX -pedantic-errors,其中XX替换为标准版本。-pedantic-errors也可以是-pedantic。对于非法代码的警告足以满足标准符合性。
无论如何,100%的符合性都是不可能的。语言规范太复杂了,而且并非所有细节都得到了很好的规定。在某些情况下,即使在更严格的符合模式下,编译器也会故意偏离规范,因为在实践中将指定的行为视为标准缺陷更有意义,即使尚未解决。

这个问题并不是很有意义。非循环的方式中,代码需要遵循标准的命令从哪里来呢?当然,编译器也可以支持不符合标准的代码。没有更高的权威要求“C++编译器”必须符合ISO C++标准。

而且即使编译器打算这样做:在某些情况下,标准规定符合标准的编译器应该发出某些诊断,但它从未要求编译器不支持任何给定的有效代码。


1

在文档中,详细解释了pedantic的含义:

发出严格的ISO C和ISO C++所要求的所有警告;拒绝使用被禁止的扩展程序以及一些不遵循ISO C和ISO C++标准的程序。

有些代码结构中,ISO C++并不要求发出警告,并且根据ISO C++标准,程序的行为是未定义的。但是未定义行为意味着标准不对程序行为做出任何要求。因此,编译器可以自行确定其行为。这种行为符合标准,"遵守"了C++标准,但仍然不属于C++标准范畴。 -pedantic用于警告使用此类标准扩展的程序。

-pedantic适用于https://eel.is/c++draft/intro#compliance.general-8

一个符合标准的实现可以具有扩展(包括其他库函数),只要它们不会改变任何格式正确的程序的行为。 根据本文档的规定,实现必须诊断使用此类扩展的格式不正确的程序。 然而,这样做之后,它们可以编译和执行此类程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接