编写合格的C代码(1):通过编译选项将特定警告视为错误

.c文件默认被C编译器编译。C编译器对某些问题,默认只报警告而不是错误;在gcc下也许还能正常运行,但VS下很可能crash;又或者在ARM平台上偶尔crash。通过设定编译选项(CFLAGS),让每一个不容忽视的警告强制报错,提前暴露问题,及早解决,从而编写合格的C代码。

下列警告应当视作错误(血泪教训):

  1. 函数没有声明就使用

VS下为/we4013。gcc下用-Werror=implicit-function-declaration

  1. 指针类型不兼容

VS下为/we4133。gcc下用-Werror=incompatible-pointer-types

  1. 函数应该有返回值但是没有return返回值

VS下为/we4716。gcc下用-Werror=return-type

强烈推荐使用CMake作为构建工具,然后在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()

其他配置方式说明:

  1. .c代码中使用#pragma warning (error: xxxx)。缺点:只有visual studio工程能用;不能确保所有文件有效
  2. Visual Studio工程属性中配置->配置属性->C/C++->高级->将特定的警告视为错误,填写"xxxx"。缺点:只适合Visual Studio;优点:非CMake生成的VS工程,适合。
  3. gcc编译时指定flags,例如gcc gcc xxx.c -Werror=implicit-function-declaration

CMakeLists.txt中配置说明:set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /weXXXX")(windows)或set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=xxxx")
其中,windows格式中XXXX为警告编号;gcc下xxxx为警告对应的字符串。这种方式个人推荐。

猜你喜欢

转载自www.cnblogs.com/zjutzz/p/10802138.html