#6. 再谈gcc

本书你都在用gcc,但只使用了gcc最基本的功能,其实它可以做更多的事。gcc就像一把瑞士军刀,它有很多特性,利用这些特性你可以严格控制它生成的代码。

#6. 再谈gcc - 图1

优化

gcc为了提高代码的性能会做很多工作。如果gcc发现你在循环中对一个变量赋了相同的值,它就会把赋值语句移动到循环外;如果一个小函数只在少数几个地方用到了,gcc就会把它转化为内联代码,然后插到程序中。

虽然gcc可以做很多优化,但绝大多数优化选项默认是关闭的。为什么?因为优化需要花很长时间,如果你尚处于开发阶段,通常希望快速编译代码。一旦准备发布代码,就可以打开优化选项。gcc一共有四个级别的优化:

标志 描述
-O 如果在gcc命令中加上-O(字母O)标志,就能得到第一级别的优化。
-O2 如果想提升优化等级,降低编译速度,就选择-O2
-O3 如果想再升一级,就选-O3,它会使用-O-O2中的所有优化,再附加一些额外的优化。
-Ofast -Ofast会打开最高级别的优化,同时编译速度也会降到最低。谨慎使用-Ofast,因为它生成的代码可能和C标准相去甚远。

警告

如果代码没有严重错误,但做了一些可疑的事情,比如把一个类型的值赋给一个错误类型的变量,编译器就会显示警告。你可以用-Wall选项提高警告检查的门槛:

  1. gcc fred.c -Wall -o fred

-Wall选项表示“所有警告(All Warnings)”,但因为一些历史原因,-Wall其实并不会显示所有的警告。如果你想让gcc那么做,就必须加上-Wextra选项:

  1. gcc fred.c -Wall -Wextra -o fred

如果你希望遵循严格的编译,就可以使用-Werror选项,只要有一个警告,编译就会失败:

#6. 再谈gcc - 图2

当多人开发同一个项目时,-Werror就显得特别有用,因为它可以维持代码的质量。

更多gcc选项请参阅:

http://gcc.gnu.org/onlinedocs/gcc