这些常见的 C++ 编译器标志有什么作用?

use*_*912 0 c++ g++ visual-c++

我是 C++ 的初学者。我仍然对 makefile 中的标志感到困惑。

-c. -o. -Wall. -g. -std=c++0x.
Run Code Online (Sandbox Code Playgroud)

谁能告诉我所有这些常见标志的作用是什么?

Che*_*Alf 6

只有最后一个标志(编译器命令选项)是特定于编译器的。我认为,自 20 世纪 80 年代初或中期以来,前三到四个已经成为事实上的标准。当然,不能保证任何特定的编译器都会理解它们,但它们并不罕见。

注意:虽然 Visual C++ 接受-标志前缀表示法,但它通常与/as 标志前缀一起使用,因为这是 Windows 中的常见约定。

  • -c
    只编译,不链接。

  • -o
    指定输出文件,例如可执行文件。不幸的是,Visual C++ 编译器已弃用。对于 Visual C++,请使用例如/Fe.

  • -Wall
    使用 g++ 所有实际警告。对于 Visual C++,所有警告(包括所有愚蠢的警告)都是一大堆!

  • -g
    生成调试信息。许多编译器支持,但 Visual C++ 不支持。

然后,

  • -std=c++0x
    是特定于 g++ 编译器的选项,指定某种C++11 标准。我记得与 的区别是-std=c++11,对于接受两者的较新编译器版本,前者仍然允许一些特定于 g++ 的语言扩展。