C语言中有哪些有用的GCC标志?

178

除了设置-Wall和设置-std=XXX之外,在C中还有哪些真正有用但不太知名的编译器标志可供使用?

我特别感兴趣的是任何其他的警告,以及在某些情况下将警告转换为错误,以尽可能地减少任何意外类型不匹配。


13
好的,“-save-temps”、“-Wshadow”和“-fmudflap”是我之前不知道的最好的发现,感谢所有人。 (译注:这段话已经是中文了,因此无需翻译) - Matt Joiner
据我所知的上下文:运行gcc -c [放置标志] -o myprog.o myprog.c以编译(而非链接)C程序。 - Rory O'Kane
相关:*C语言推荐的GCC警告选项* - Peter Mortensen
24个回答

3

虽然这个回答可能有些偏题,但问题很值得+1,因为

我特别关注任何额外的警告,和/或者在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配。

有一个工具可以捕捉所有错误和潜在错误,这些错误可能并不明显。这是Splint,在捕捉错误方面比GCC或其他任何编译器都要好。它是你的工具箱中必备的有价值的工具。

通过类似Splint这样的lint类型工具进行静态检查应该是编译器工具链的一部分。


1
它总是显示一个错误,无法在 C:\include 中找到预处理器文件,我不确定该怎么办。 - Suraj Jain

2
“我特别关心任何额外的警告,”
除了 -Wall 外,-W-Wextra 选项(-W 可与较旧版本的 gcc 以及更新版本一起使用;更近期的版本支持另一种名称 -Wextra,它意思相同但更具描述性)可以启用各种其他警告。
还有更多警告信息,这些警告信息通常是针对那些可能存在问题的事情。可用选项集取决于使用的gcc版本 - 请参阅man gccinfo gcc了解详情,或者查看您感兴趣的特定gcc版本的在线文档-pedantic会发出符合正在使用的特定标准所需的所有警告(这取决于其他选项,如-std=xxx-ansi),并抱怨使用了gcc扩展功能。

在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配。

"-Werror"将所有警告转换为错误。我不认为gcc允许您有选择地针对特定警告进行操作。
您可能会发现,您需要在每个项目上有选择地启用哪些警告(特别是如果您使用“-Werror”),因为来自外部库的头文件可能会触发其中一些警告。(根据我的经验,“-pedantic”在这方面往往没有帮助。)

4
“我不认为gcc允许你有选择地针对特定警告进行设置,不过。”实际上,你可以通过“-Werror=some-warning”实现。 - Matthew Flaschen

1
  • -Wmissing-prototypes:如果定义全局函数时没有先声明原型。
  • -Wformat-security:警告可能存在安全问题的格式函数使用。目前,此警告会针对调用printfscanf函数的情况进行警告,其中格式字符串不是字符串字面值且没有格式参数。

1

实际上,我希望我的 C 代码可以跨平台使用。我使用 CMake,并将提供的 cflags 放入 CMakeLists.txt 中,例如:

if (CMAKE_SYSTEM_NAME MATCHES "Windows")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /we4013 /we4133 /we4716")
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -Werror=return-type")
endif()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接