不常见可是颇有用的 GCC 命令行选项(二)

导读 gcc 编译器提供了几乎数不清的命令行选项列表。固然,没有人会使用过或者精通它全部的命令行选项,可是有一些命令行选项是每个 gcc 用户都应该知道的 - 即便不是必须知道。它们中有一些很经常使用,其余一些不太经常使用,但不经常使用并不意味着它们的用处没前者大。

回顾html

在这个系列的文章中,咱们集中于一些不经常使用可是颇有用的 gcc 命令行选项,在第一节已经讲到几个这样的命令行选项。linux

不知道你是否可以回想起,在这个系列教程的第一部分的开始,我简要的提到了开发者们一般用来生成警告的 -Wall 选项,并不包括一些特殊的警告。若是你不了解这些特殊警告,而且不知道如何生成它们,不用担忧,我将在这篇文章中详细讲解关于它们全部的细节。程序员

除此之外,这篇文章也将涉及与浮点值相关的 gcc 警告选项,以及在 gcc 命令行选项列表变得很大的时候如何更好的管理它们。数组

在继续以前,请记住,这个教程中的全部例子、命令和指令都已在 Ubuntu 16.04 LTS 操做系统和 gcc 5.4.0 上测试过。ide

生成 -Wall 选项不包括的警告函数

尽管 gcc 编译器的 -Wall 选项涵盖了绝大多数警告标记,依然有一些警告不能生成。为了生成它们,请使用 -Wextra 选项。测试

好比,下面的代码:操作系统

1.#include 
2.#include 
3.int main()
4.{
5.    int i=0;
6.    /* ...
7.       some code here 
8.       ...
9.    */
10.
11.    if(i);
12.        return 1;
13.     return 0; 
14.}

我不当心在 if 条件后面多打了一个分号。如今,若是使用下面的 gcc 命令来进行编译,不会生成任何警告。.net

1.gcc -Wall test.c -o test

可是若是同时使用 -Wextra 选项来进行编译:命令行

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

会生成下面这样一个警告:

1.test.c: In function ‘main’:
2.test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
3. if(i);

从上面的警告清楚的看到, -Wextra 选项从内部启用了 -Wempty-body 选项,从而能够检测可疑代码并生成警告。下面是这个选项启用的所有警告标记。

•-Wclobbered
•-Wempty-body
•-Wignored-qualifiers
•-Wmissing-field-initializers
•-Wmissing-parameter-type (仅针对 C 语言)
•-Wold-style-declaration (仅针对 C 语言)
•-Woverride-init
•-Wsign-compare
•-Wtype-limits
•-Wuninitialized
•-Wunused-parameter (只有和 -Wunused 或 -Wall 选项使用时才会启用)
•-Wunused-but-set-parameter (只有和-Wunused或-Wall` 选项使用时才会生成)

若是想对上面所提到的标记有更进一步的了解,请查看 gcc 手册。

此外,遇到下面这些状况, -Wextra 选项也会生成警告:
•一个指针和整数 0 进行 < , <=, >, 或 >= 比较
•(仅 C++)一个枚举类型和一个非枚举类型同时出如今一个条件表达式中
•(仅 C++)有歧义的虚拟基底
•(仅 C++)寄存器类型的数组加下标
•(仅 C++)对寄存器类型的变量进行取址
•(仅 C++)基类没有在派生类的复制构建函数中进行初始化

浮点值的等值比较时生成警告

你可能已经知道,浮点值不能进行确切的相等比较(若是不知道,请阅读与浮点值比较相关的 FAQ)。可是若是你不当心这样作了, gcc 编译器是否会报出错误或警告?让咱们来测试一下:

下面是一段使用 == 运算符进行浮点值比较的代码:

1.#include
2.
3.void compare(float x, float y)
4.{
5.    if(x == y)
6.    {
7.        printf("\n EQUAL \n");
8.    }
9.}
10.
11.int main(void)
12.{
13.    compare(1.234, 1.56789);
14.
15.    return 0; 
16.}

使用下面的 gcc 命令(包含 -Wall 和 -Wextra 选项)来编译这段代码:

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

遗憾的是,上面的命令没有生成任何与浮点值比较相关的警告。快速看一下 gcc 手册,在这种情形下可使用一个专用的 -Wfloat-equal 选项。

下面是包含这个选项的命令:

1.gcc -Wall -Wextra -Wfloat-equal test.c -o test

下面是这条命令产生的输出:

1.test.c: In function ‘compare’:
2.test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
3. if(x == y)

正如上面你所看到的输出那样, -Wfloat-equal 选项会强制 gcc 编译器生成一个与浮点值比较相关的警告。

这儿是gcc 手册关于这一选项的说明:

"这背后的想法是,有时,对程序员来讲,把浮点值考虑成近似无限精确的实数是方便的。若是你这样作,那么你须要经过分析代码,或者其余方式,算出这种计算方式引入的最大或可能的最大偏差,而后进行比较时(以及产生输出时,不过这是一个不一样的问题)容许这个偏差。特别要指出,不该该检查是否相等,而应该检查两个值是否可能出现范围重叠;这是用关系运算符来作的,因此等值比较多是搞错了。"

如何更好的管理 gcc 命令行选项

若是在你使用的 gcc 命令中,命令行选项列表变得很大并且很难管理,那么你能够把它放在一个文本文件中,而后把文件名做为 gcc 命令的一个参数。以后,你必须使用 @file 命令行选项。

好比,下面这行是你的 gcc 命令:

1.gcc -Wall -Wextra -Wfloat-equal test.c -o test

而后你能够把这三个和警告相关的选项放到一个文件里,文件名叫作 gcc-options:

1.$ cat gcc-options 
2.-Wall -Wextra -Wfloat-equal

这样,你的 gcc 命令会变得更加简洁而且易于管理:

1.gcc @gcc-options test.c -o test

下面是 gcc 手册关于 @file 的说明:

"从文件中读取命令行选项。读取到的选项随之被插入到原始 @file 选项所在的位置。若是文件不存在或者没法读取,那么这个选项就会被当成文字处理,而不会被删除。

文件中的选项以空格分隔。选项中包含空白字符的话,能够用一个由单引号或双引号包围完整选项。任何字符(包括反斜杠: '\')都可能经过一个 '\' 前缀而包含在一个选项中。若是该文件自己包含额外的 @file 选项,那么它将会被递归处理。
"

结论

在这个系列的教程中,咱们一共讲解了 5 个不常见可是颇有用的 gcc 命令行选项: -Save-temps、-g、 -Wextra、-Wfloat-equal 以及 @file。记得花时间练习使用每个选项,同时不要忘了浏览 gcc 手册上面所提供的关于它们的所有细节。

你是否知道或使用其余像这样有用的 gcc 命令行选项,并但愿把它们在全世界范围内分享?请在下面的评论区留下全部的细节。

原文来自:https://linux.cn/article-8032-1.html

本文地址: http://www.linuxprobe.com/usual-gcc-command.html

相关文章
相关标签/搜索