我不理解 g++ 的 -pedantic
标志的意义。
代码默认编译时不遵循 C++ 标准吗?
如果我添加或者不添加这个标志,编译器逻辑上应该会发出相同的警告,对吗?
这个问题并不是很有意义。非循环的方式中,代码需要遵循标准的命令从哪里来呢?当然,编译器也可以支持不符合标准的代码。没有更高的权威要求“C++编译器”必须符合ISO C++标准。
而且即使编译器打算这样做:在某些情况下,标准规定符合标准的编译器应该发出某些诊断,但它从未要求编译器不支持任何给定的有效代码。
在文档中,详细解释了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 :
一个符合标准的实现可以具有扩展(包括其他库函数),只要它们不会改变任何格式正确的程序的行为。 根据本文档的规定,实现必须诊断使用此类扩展的格式不正确的程序。 然而,这样做之后,它们可以编译和执行此类程序。
unsigned n = -1e1;
,我就会换另一个供应商。 - Bathsheba