当前位置: 首页 > 科技观察

不常见但有用的gcc命令行选项(2)

时间:2023-03-16 17:19:36 科技观察

gcc编译器提供了几乎无穷无尽的命令行选项列表。当然,没有人会使用或精通它的所有命令行选项,但是有一些命令行选项是每个gcc用户都应该知道的——如果不是必须的话。其中一些常用,另一些不常用,但不常用并不意味着它们用处不大。在本系列文章中,我们重点介绍了一些不常见但很有用的gcc命令行选项,并且在第***节中已经提到了几个这样的命令行选项。不知道大家是否还记得,在本系列教程的***部分开头,我简单提到了开发者通常用来产生警告的-Wall选项,并没有包含一些特殊的警告。如果您不知道这些特殊警告,也不知道如何生成它们,请不要担心,我将在本文中解释有关它们的所有细节。此外,本文还将涵盖与浮点值相关的gcc警告选项,以及当gcc命令行选项列表变大时如何更好地管理它们。在继续之前,请记住本教程中的所有示例、命令和说明都已在Ubuntu16.04LTS操作系统和gcc5.4.0上进行了测试。生成-Wall选项未涵盖的警告尽管gcc编译器的-Wall选项涵盖了大多数警告标志,但仍有一些警告无法生成。为了生成它们,请使用-Wextra选项。例如,下面的代码:#include#includeintmain(){inti=0;/*...somecodehere...*/if(i);return1;return0;}我不小心在if条件后面多加了一个分号。现在,如果您使用下面的gcc命令进行编译,将不会生成任何警告。gcc-Walltest.c-otest但如果同时使用-Wextra选项编译:gcc-Wall-Wextratest.c-otest将生成以下警告:test.c:Infunction'main':test.c:10:8:warning:suggestbracesaroundemptybodyinan'if'statement[-Wempty-body]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++)基类不在派生类副本构建中初始化的相等比较时生成警告浮点值在函数中执行。您可能已经知道,无法比较浮点值是否完全相等(如果您不知道,请阅读与浮点值比较相关的常见问题解答)。但是如果你不小心这样做了,gcc编译器会不会报错或者警告呢?让我们测试一下:这是一段使用==运算符比较浮点值的代码:#includevoidcompare(floatx,floaty){if(x==y){printf("\nEQUAL\n");}}intmain(void){compare(1.234,1.56789);return0;}使用以下gcc命令(包含-Wall和-Wextra选项)编译此代码:gcc-Wall-Wextratest.c-otest遗憾的是,上述命令不会生成任何与浮点值比较相关的警告。快速浏览一下gcc手册,在这种情况下可以使用一个特殊的-Wfloat-equal选项。以下是包含此选项的命令:gcc-Wall-Wextra-Wfloat-equaltest.c-otest以下是此命令产生的输出:test.c:Infunction'compare':test.c:5:10:warning:comparingfloatingpointwith==or!=isunsafe[-Wfloat-equal]if(x==y)正如您在上面的输出中看到的,-Wfloat-equal选项强制gcc编译器生成与浮点值比较相关的警告.以下是gcc手册中关于此选项的说明:这背后的想法是,有时,程序员将浮点值视为近似最精确的实数会很方便。如果你这样做,那么你需要分析代码,否则,找出这种计算方法引入的最大或可能的最大误差,然后比较(并生成输出,但这是一个不同的问题)以允许这个错误.特别是,您不应该检查是否相等,而是检查两个值之间可能存在的范围重叠;这是通过关系运算符完成的,因此相等比较可能会搞砸。如何更好地管理gcc命令行选项如果在你使用的gcc命令中,命令行选项列表变大,难以管理,那么你可以把它放在一个文本文件中,然后把文件名作为gcc命令的a的参数。之后,您必须使用@file命令行选项。例如,下面一行是你的gcc命令:gcc-Wall-Wextra-Wfloat-equaltest.c-otest那么你可以将这三个与警告相关的选项放入一个名为gcc-options的文件中:$catgcc-options-Wall-Wextra-Wfloat-equal这样,你的gcc命令会变得更加简洁易管理:gcc@gcc-optionstest.c-otest以下是gcc手册中对@file的描述:从文件中读取命令行选项.然后插入读取选项以代替原始的@file选项。如果文件不存在或无法读取,则此选项将被视为文本,不会被删除。文件中的选项以空格分隔。包含空白字符的选项可以用单引号或双引号括起来以完成选项。任何字符(包括反斜杠:“\”)都可以通过在选项前加上“\”作为前缀来包含在选项中。如果文件本身包含额外的@file选项,它将被递归处理。结论在本系列教程中,我们介绍了五个不常见但有用的gcc命令行选项:-Save-temps、-g、-Wextra、-Wfloat-equal和@file。请记住花时间练习使用每个选项,并且不要忘记浏览gcc手册以获取有关它们的完整详细信息。您是否知道或使用任何其他有用的gcc命令行选项,并想与世界分享?请在下面的评论部分留下所有详细信息。