Heim > System-Tutorial > LINUX > Hauptteil

GCC命令:解锁Linux编程的无限可能

WBOY
Freigeben: 2024-02-10 18:54:22
nach vorne
756 人浏览过

作为广受欢迎的开源编译器,GCC(GNU Compiler Collection)已经成为了Linux软件开发的标配之一。如果你想要进入Linux编程的世界,那么掌握GCC命令是必不可少的。无论你是初学者还是专业开发人员,GCC都可以为你带来无限的可能性。

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

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

不知道你是否能够回想起,在这个系列教程的第一部分的开始,我简要的提到了开发者们通常用来生成警告的-Wall 选项,并不包括一些特殊的警告。如果你不了解这些特殊警告,并且不知道如何生成它们,不用担心,我将在这篇文章中详细讲解关于它们所有的细节。

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

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

GCC命令:解锁Linux编程的无限可能

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

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

比如,下面的代码:

#include 
#include 
int main()
{
    int i=0;
    /* ...
       some code here 
       ...
    */

    if(i);
        return 1;
     return 0; 
}
Nach dem Login kopieren

我不小心在 if 条件后面多打了一个分号。现在,如果使用下面的 gcc 命令来进行编译,不会生成任何警告。
gcc -Wall test.c -o test

但是如果同时使用-Wextra 选项来进行编译:gcc -Wall -Wextra test.c -o test
会生成下面这样一个警告:

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

从上面的警告清楚的看到,-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 选项使用时才会生成)
Nach dem Login kopieren

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

此外,遇到下面这些情况,-Wextra 选项也会生成警告:

一个指针和整数 0 进行 , 或 >= 比较
(仅 C++)一个枚举类型和一个非枚举类型同时出现在一个条件表达式中
(仅 C++)有歧义的虚拟基底
(仅 C++)寄存器类型的数组加下标
(仅 C++)对寄存器类型的变量进行取址
(仅 C++)基类没有在派生类的复制构建函数中进行初始化
Nach dem Login kopieren

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

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

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

#include

void compare(float x, float y)
{
    if(x == y)
    {
        printf("/n EQUAL /n");
    }
}

int main(void)
{
    compare(1.234, 1.56789);

    return 0; 
}
Nach dem Login kopieren

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

gcc -Wall -Wextra test.c -o test
Nach dem Login kopieren

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

gcc -Wall -Wextra -Wfloat-equal test.c -o test
Nach dem Login kopieren

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

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

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

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

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

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

如果在你使用的 gcc 命令中,命令行选项列表变得很大而且很难管理,那么你可以把它放在一个文本文件中,然后把文件名作为 gcc 命令的一个参数。之后,你必须使用@file 命令行选项。

比如,下面这行是你的 gcc 命令:
gcc -Wall -Wextra -Wfloat-equal test.c -o test

然后你可以把这三个和警告相关的选项放到一个文件里,文件名叫做 gcc-options:
$ cat gcc-options
-Wall -Wextra -Wfloat-equal
这样,你的 gcc 命令会变得更加简洁并且易于管理:
gcc @gcc-options test.c -o test

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

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

文件中的选项以空格分隔。选项中包含空白字符的话,可以用一个由单引号或双引号包围完整选项。任何字符(包括反斜杠: ‘/’)均可能通过一个 ‘/’ 前缀而包含在一个选项中。如果该文件本身包含额外的 @file选项,那么它将会被递归处理。

结论

在这个系列的教程中,我们一共讲解了 5 个不常见但是很有用的 gcc 命令行选项:

-Save-temps
-g
-Wextra
-Wfloat-equal

@file
Nach dem Login kopieren

记得花时间练习使用每一个选项,同时不要忘了浏览 gcc 手册上面所提供的关于它们的全部细节。

因此,无论你是正在学习Linux编程,还是已经成为一名经验丰富的开发者,掌握GCC命令将会让你事半功倍。尝试使用GCC命令去编译各种不同的程序,挑战自己的极限,让你的Linux编程之路越来越精彩

以上是GCC命令:解锁Linux编程的无限可能的详细内容。更多信息请关注PHP中文网其他相关文章!

Quelle:lxlinux.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!