编译过程 - windows编译c++




在GCC/G++编译器中使用-pedantic的目的是什么? (6)

这个笔记说:

-ansi :告诉编译器实现ANSI语言选项。 这关闭了与ANSI标准不兼容的GCC的某些“特征”。

-pedantic :与-ansi一起使用,这告诉编译器严格遵守ANSI标准,拒绝任何不合规的代码。

首先要做的是:

  • GCC / G ++编译器的-pedantic-ansi选项的用途是什么(我无法理解上面的描述)?
  • 任何人都可以告诉我使用这两种选择的正确情况吗?
  • 我应该什么时候使用它们?
  • 它们很重要吗?

GCC编译器总是试图编译你的程序,如果这是可能的话。 但是,在某些情况下,C和C ++标准指定禁止某些扩展。 符合编译器如gcc或g ++必须在遇到这些扩展时发布诊断。 例如,gcc编译器的-pedantic选项会导致gcc在这种情况下发出警告。 使用更严格-pedantic-errors选项将这些诊断警告转换为会导致编译失败的错误。 只有那些需要由符合编译器标记的非ISO结构才会产生警告或错误。


Pedantic使得gcc编译器拒绝所有的GNU C扩展,而不仅仅是那些使ANSI兼容的扩展。


其他人已经充分回答。 我只想添加一些常见扩展的例子:

main函数返回void 。 这不是由标准定义的,这意味着它只适用于某些编译器(包括GCC),但不适用于其他编译器。 顺便说一句, int main()int main(int, char**)是标准确定的两个签名。

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

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

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

这是非标准的。 如果你想要这种行为,请查看C ++ 11 lambda表达式


基本上,它会使您的代码在其他也实现ANSI标准的编译器下编译起来更容易,并且,如果您在其他操作系统/平台下小心使用了库/ api调用。

第一个关闭GCC的特定功能。 (-ansi)第二个,会抱怨任何不符合标准的东西(不仅仅是GCC的特定功能,也包括你的构造)。(-pedantic)。


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


我一直在编码中使用它。

-ansi标志等同于-std=c89 。 如上所述,它关闭了GCC的一些扩展。 添加-pedantic会关闭更多扩展并生成更多警告。 例如,如果您的字符串文字长度超过509个字符,则由于它超出了C89标准所要求的最小限制,所以-pedantic警告。 也就是说,每个C89编译器都必须接受长度为509的字符串; 他们被允许接受更长的时间,但如果你是迂腐的,即使允许编译器接受更长的字符串,并且没有迂腐的警告,GCC也会接受它们,使用更长的字符串是不可移植的。





g++