虽然这个回答可能有些偏题,但问题很值得+1,因为
我特别关注任何额外的警告,和/或者在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配。
有一个工具可以捕捉所有错误和潜在错误,这些错误可能并不明显。这是Splint,在捕捉错误方面比GCC或其他任何编译器都要好。它是你的工具箱中必备的有价值的工具。
通过类似Splint这样的lint类型工具进行静态检查应该是编译器工具链的一部分。
-W
可与较旧版本的 gcc 以及更新版本一起使用;更近期的版本支持另一种名称 -Wextra
,它意思相同但更具描述性)可以启用各种其他警告。man gcc
或info gcc
了解详情,或者查看您感兴趣的特定gcc版本的在线文档。 -pedantic会发出符合正在使用的特定标准所需的所有警告(这取决于其他选项,如-std=xxx或-ansi),并抱怨使用了gcc扩展功能。
"-Werror"将所有警告转换为错误。我不认为gcc允许您有选择地针对特定警告进行操作。在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配。
printf
和scanf
函数的情况进行警告,其中格式字符串不是字符串字面值且没有格式参数。-Werror=return-type: 当一个函数没有返回值时,在GCC中强制执行错误。在Visual Studio中,它是/we4716
。
-Werror=implicit-function-declaration:当一个未被定义/不包含的函数被使用时,强制执行错误。在Visual Studio中,它是/we4013
。
-Werror=incompatible-pointer-types:当指针的类型与预期的指针类型不匹配时,强制执行错误。在Visual Studio中,它是/we4133
。
实际上,我希望我的 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()
gcc -c [放置标志] -o myprog.o myprog.c
以编译(而非链接)C程序。 - Rory O'Kane