C++ 在GCC/G+中使用-pedantic的目的是什么+;编译程序?

C++ 在GCC/G+中使用-pedantic的目的是什么+;编译程序?,c++,c,gcc,g++,C++,C,Gcc,G++,说: -ansi:告诉编译器实现ansi语言选项。这变成 关闭GCC的某些“功能”,其中 与ANSI标准不兼容 标准 -pedantic:与-ansi一起使用,这告诉编译器严格遵守ansi标准, 拒绝任何不正确的代码 顺从的 第一件事: GCC/G++编译器的-pedantic和-ansi选项的用途是什么(我无法理解上面的描述) 有谁能告诉我使用这两个选项的正确情况吗 我应该什么时候使用它们 它们重要吗 如果您的代码需要可移植,那么您可以测试它是否编译时没有任何gcc扩展或其他非标准功能。如果

说:

-ansi
:告诉编译器实现ansi语言选项。这变成 关闭GCC的某些“功能”,其中 与ANSI标准不兼容 标准

-pedantic
:与
-ansi
一起使用,这告诉编译器严格遵守ansi标准, 拒绝任何不正确的代码 顺从的

第一件事:

  • GCC/G++编译器的
    -pedantic
    -ansi
    选项的用途是什么(我无法理解上面的描述)
  • 有谁能告诉我使用这两个选项的正确情况吗
  • 我应该什么时候使用它们
  • 它们重要吗

如果您的代码需要可移植,那么您可以测试它是否编译时没有任何gcc扩展或其他非标准功能。如果您的代码是用
-pedantic-ansi
编译的,那么理论上,它应该可以用任何其他ansi标准编译器编译。

如果您正在编写的代码将在多种平台上编译,使用许多不同的编译器,然后自己使用这些标志将有助于确保不会生成仅在GCC下编译的代码。

我在编码时一直使用它


-ansi
标志相当于
-std=c89
。如前所述,它关闭了GCC的一些扩展。添加
-pedantic
将关闭更多扩展并生成更多警告。例如,如果字符串文字长度超过509个字符,则
-pedantic
会发出警告,因为它超过了C89标准要求的最小限制。也就是说,每个C89编译器必须接受长度为509的字符串;他们可以接受更长的字符串,但是如果你是学究,使用更长的字符串是不可移植的,即使编译器可以接受更长的字符串,并且没有学究式的警告,GCC也会接受它们。

基本上,这将使您的代码更容易在其他编译器下编译,这些编译器也实现了ANSI标准,如果您在使用哪些库/api调用时非常小心,那么在其他操作系统/平台下也会更容易编译

第一个,关闭GCC的特定功能。(-ansi)
第二个,会抱怨任何不符合标准的东西(不仅是GCC的特定特性,还有您的构造)。(-pedantic).Pedantic使gcc编译器拒绝所有GNU C扩展,而不仅仅是使其与ANSI兼容的扩展。

如果可能的话,gcc编译器总是尝试编译您的程序。然而,在某些情况下 案例中,C和C++标准规定禁止某些扩展。一致性编译器 例如gcc或g++在遇到这些扩展时必须发出诊断。例如 gcc编译器的-pedantic选项会导致gcc在这种情况下发出警告。使用更严格的
-迂腐错误
选项将此类诊断警告转换为会导致编译的错误 在这种情况下失败。只有那些非ISO结构需要由符合要求的
编译器将生成警告或错误。

其他人已充分回答。我只想添加几个频繁扩展的示例:

main
函数返回
void
。这个标准没有定义,这意味着它只能在某些编译器(包括GCC)上工作,而不能在其他编译器上工作。顺便说一下,
intmain()
intmain(int,char**)
是标准定义的两个签名

另一个流行的扩展是能够在其他函数中声明和定义函数:

void f()
{
    void g()
    {
       // ...
    }

    // ...
    g();
    // ...
}

这是不标准的。如果您想要这种行为,请查看

-pedantic
并没有关闭所有扩展,它会留下一堆双下划线的内容。所以更准确的说法是,如果您的代码使用
-pedantic-ansi
编译,并且看起来似乎它可能在其他实现上编译,那么它将编译。您提到了双下划线的东西,这听起来很有趣。你到底指的是什么?一个例子是gcc的“\uuuu asm\uuuu()”内联汇编代码,这对gcc来说很好,但双下划线的东西可能在Windows编译器上不起作用,即使该编译器符合标准。-ansi关闭gcc的一些扩展,而-pedantic关闭更多扩展。似乎-ansi是第一级规则,然后-pedantic是更严格的规则。这是否意味着删除这两个选项后,我的代码可以与其他编译器(如Microsoft one)更兼容?@华新68:嗯,或多或少。MSVC是一个与大多数其他编译器完全不同的编译器,它更适合于其特定的生态系统,并且在外部不可用。它以自己的方式做很多事情——这与标准不同。尽管如此,如果您继续使用标准头等等,那么MSVC和GCC是相当相似的。但是,使用
-std=c89-pedantic
确实意味着可以更轻松地在其他平台上的不同编译器之间移动。一旦您开始使用
,与其他系统的兼容性就会出现问题。@slf:因为和其他供应商一样(尽管GNU不以现金形式出售编译器),他们希望您使用他们的专有功能?或者,更一般地说,因为他们认为扩展是有用的,并且认为它们应该在默认情况下被启用。对于任何有价值的东西,我都已经停止使用<代码> -PoANTICT<代码>,但是当我重新启用时,我的大多数代码仍然编译为OK。(有一个程序没有明确使用
\uuu int128
类型,这是学究式的错误)。我认为有一个干预阶段,GCC使用
-pedantic
太吵了(我不喜欢)。我刚刚测试了大约300个源文件-一些库代码,一些
struct test {
    int zero_size_array[0];
};
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
     int zero_size_array[0];
         ^~~~~~~~~~~~~~~