目录
GCC 的选项配置是编译时很重要的选择,例如头文件路径、加载库路径、警告信息及调试等。将对常用的选项进行介绍。
-DMACRO 选项
定义一个宏,在多种预定义的程序中会经常使用。如下代码根据系统是否定义 Linux 宏来执行不同的代码。使用 -D 选项可以选择不同的代码段,例如 -DOS_LINUX 选项将执行代码段 1。
#ifdef OS_LINUX
...代码段 1
#else
...代码段 2
#endif
-Idir :将头文件的搜索路径扩大,包含 dir 目录。
-Ldir :将链接时使用的链接库搜索路径扩大,包含 dir 目录。 gcc 都会优先使用共享程序库。
-static :仅选用静态程序库进行链接,如果一个目录中静态库和动态库都存在,则仅选用静态库。
-g :包括调试信息。
-On :优化程序,程序优化后执行速度会更快,程序的占用空间会更小。通常 gcc 会进行很小的优化,优化的级别可以选择,即 n 。最常用的优化级别是2.
-Wall :打开所有 gcc 能够提供的、常用的警告信息。
GCC的常用选项及含义
下表是 GCC 的常用选项和含义,主要列出了警告选项、代码检查、 ANSI 兼容等。可以在编译程序的时候对 GCC 的选项进行设置,编写质量高的代码。
常用的编译选项及含义 | ||
GCC的警告选项 | 含义 | |
-Wall警告选项 | -Wchar-subscripts | 这个选项针对数组的下标值,如果下标值是 char 类型的则给出警告。因为在一些平台上, char 类型的变量可能定义为 signed char ,是一个符号类型的整数,所以 char 类型的变量做下标时,当下标的值为负数时可能造成内存溢出 |
-Wcomment | 这个选项针对代码中的注释,如果出现不合适的注释格式的时候会出现警告。例如在“/*.….*/”中间出现“/*”,或者在“//…”类型的注释末尾出现符号“\”的时候, GCC 给出警告 | |
-Wformat | 这个选项针对输入输出的格式,检查 printf 和 scanf 等格式化输入输出函数的格式字符串与参数类型的匹配情况,如果发现不匹配则发出警告 | |
-Wimplicit | 这个选项针对函数的声明,这个选项是选项-Wimplicit-int 和选项-Wimplicit-function-declaration 两个选项的集合 第一个选项在声明函数时如果没有指定返回值会给出警告:第二个参数如果在声明前调用函数会给出警告 | |
-Wmissing-braces | 这个选项针对结构类型或者数组初始化时的不合适格式。例如, int aray [2][2]={0,0,1,1}; 由于初始化的表达式没有充分用{}括起来, GCC 会给出警告,应该采用下面的定义方法: int aray [2][2]={{0,0},{1,1}}; | |
-Wparentheses | 这个选项针对多种优先级的操作符在一起或者代码结构难以看明白的操作,如果没有将操作进行明晰地分离, GCC 会给出警告。例如, if ( a && b|| c )中的3个变量 a 、 b 和 c 的操作顺序应该用括号分离 | |
-Wsequence-point | 这个选项针对顺序点,如果在代码中使用了有可能造成顺序点变化的语句, GCC 会给出警告。例如,代码 i = i++ 在不同的平台上 i 值的结果是不同的,如果使用了这样的代码, GCC 会给出警告 | |
-Wswitch | 这个选项针对 switch 语句,如果一个 switch 语句中没有 default 条件,GCC 会给出警告信息 | |
-Wunused | 这个选项针对代码中没有用到的变量、函数、值、转跳点等,它是 -Wunused-function 、-Wunused-label 、-Wunused- variable 、-Wunused-value 选项的集合。 -Wunused-function 选项警告代码中存在没有使用的静态函数,或者只定义却没有实现的静态函数; -Wunused - label 选项警告代码中存在定义了却没有使用,或者使用了却没有定义的标签; -Wunused-variable 选项警告代码中存在定义了却没有使用的局部变量; -Wunused-value 选项警告代码中计算表达式的结果没有使用。 | |
-Wunused-parameter | 这个选项针对函数参数,如果一个函数的参数在函数实现中没有用到, GCC 会给出警告信息 | |
-Wuninitialized | 这个选项针对没有初始化变量的使用,如果一个局部变量在使用之前没有初始化, GCC 会给出警告信息 | |
非 -Wall警告选项 | -Wflot-equal | 这个选项针对浮点值相等的判定,由于浮点值的确切值难以得知,所以如果浮点值出现在相等判定的表达式中, GCC 会给出警告。浮点值的相等判定可以用浮点值的差与某个小值比较判定是否相等 |
-Wshadow | 这个选项用于局部变量作用域内的同名变量,如果局部变量的作用域范围内有其他同名变量时,局部变量会遮蔽全局变量,这时 GCC 会给出警告信息 | |
-Wbad-function-cast | 这个选项针对函数的返回值,当函数的返回值赋给不匹配的类型时, GCC 会给出警告信息 | |
-Wsign-compare | 这个选项针对有符号数和无符号数的比较,由于无符号数的优先级比有符号数的优先级高,二者进行比较运算的时候,会先将有符号数转换为无符号数,在负的有符号数和无符号数进行比较的时候,容易出现错误。 | |
-Waggregate-return | 这个选项针对结构类型的函数返回值,如果函数的返回值为结构、联合等类型时, GCC 会给出警告信息 | |
-Wmultichar | 这个选项针对字符类型变量的错误赋值,当使用类似 char c = ‘test’这样的代码时, GCC 会给出警告 | |
-Wunreachable-code | 这个选项针对冗余代码,如果代码中有不能到达的代码时, GCC 会给出警告信息 | |
其他 | -Wtraditional | 选项 traditional 试图支持传统 C 编译器的某些方面 |
ANSI 兼容 | -ansi | 与 ansi 的 C 语言兼容 |
-pedantic | 允许发出 ANSI/ISO C 标准所列出的所有警告 | |
-pedantic-errors | 允许发出 ANSI/ISO C 标准所列出的所有错误 | |
编译检査 | -fsyntax -only | 仅进行编译检查而不实际编译程序 |
注意:在编写代码的时候,不好的习惯会造成程序执行过程中发生错误。在一个比较大的项目中,当程序运行起来后再查找这些错误是很困难的。因此一种好的习惯是使用编译选项将代码的警告信息显示出来,并对代码进行改正。例如,打开编译选项 -Wall 和-W 来显示所有的警告信息,甚至更严格一些,打开-Weror 将编译时的警告信息作为错误信息来处理,中断编译。
凡是过往,即为序章