文章目录
编译器警告介绍:
msvc (微软编译器)
clang和gcc编译器警告介绍
cmake设置编译器警告方法
编译器警告介绍:
编译器警告是编译器在编译代码时发出的警告,它表示代码中存在潜在的错误或问题。编译器警告不是错误,编译器仍然会生成可执行文件,但警告表示代码可能存在问题,需要开发人员注意。
编译器警告需要是因为代码中存在潜在的错误或问题,如果不及时发现和解决,可能会导致程序运行时崩溃、数据丢失或其他问题。编译器警告可以帮助开发人员在代码编写阶段发现这些潜在的问题,从而提高代码的质量和可靠性。
建议在开发过程中使用 -Wall 或 -Wextra 来启用所有标准警告。如果需要进一步提高代码的质量和安全性,可以使用 -Wpedantic 来启用更加严格的警告。
msvc (微软编译器)
/W4 编译器的一个选项,它将启用所有标准警告,并将一些额外的警告设置为默认启用。/W4 可以帮助开发人员发现代码中潜在的错误和问题,提高代码的质量和可靠性。
具体的,/W4 将启用以下警告:
所有标准警告
所有额外警告
一些更加严格的警告
,例如:
不符合 C 或 C++ 标准的代码
可能导致意外行为的代码
可能导致代码难以维护的代码
/permissive-
/permissive- 是 微软 编译器的一个选项,它将禁用一些 Microsoft 扩展。/permissive- 可以帮助开发人员遵循 C 或 C++ 标准,提高代码的可移植性。
具体的,/permissive- 将禁用以下警告:
Microsoft 扩展警告
,例如:
-Wsign-compare:警告比较操作符的两侧类型不同,但结果可能会是相同的。
-Wswitch-enum:警告 switch 语句的枚举类型中没有所有枚举值。
使用建议
建议在开发过程中使用 /W4 来启用所有标准警告,并使用 /permissive- 来禁用 Microsoft 扩展。这样可以帮助开发人员发现代码中潜在的错误和问题,提高代码的质量、可靠性和可移植性。
以下是一些具体的使用建议:
在开发的早期阶段,使用 /W4 来发现代码中潜在的错误。
在开发的后期阶段,使用 /W4 和 /permissive- 来进一步提高代码的质量和可靠性。
在生产环境中,使用 /W4 和 /permissive- 来确保代码的稳定性。
clang和gcc编译器警告介绍
以下是关于 -Wall、-Wextra 和 -Wpedantic 的介绍:
-Wall
-Wall 是 GCC 和 Clang 编译器的一个选项,它将启用所有标准警告。标准警告包括:
未初始化变量
未使用的变量
未定义的符号
类型不匹配
可能导致错误的操作
-Wall 可以帮助开发人员发现代码中潜在的错误,提高代码的质量。
-Wextra
-Wextra 是 -Wall 的一个扩展,它将启用一些额外的警告。这些额外的警告包括:
未使用的函数参数
未使用的局部变量
可能导致性能下降的操作
可能导致安全问题的操作
-Wextra 可以帮助开发人员发现代码中潜在的问题,提高代码的性能和安全性。
-Wpedantic
-Wpedantic 是 -Wall 和 -Wextra 的一个扩展,它将启用一些更加严格的警告。这些警告包括:
不符合 C 或 C++ 标准的代码
可能导致意外行为的代码
可能导致代码难以维护的代码
-Wpedantic 可以帮助开发人员遵循 C 或 C++ 标准,提高代码的可维护性。
使用建议
建议在开发过程中使用 -Wall 或 -Wextra 来启用所有标准警告。如果需要进一步提高代码的质量和安全性,可以使用 -Wpedantic 来启用更加严格的警告。
以下是一些具体的使用建议:
在开发的早期阶段,使用 -Wall 或 -Wextra 来发现代码中潜在的错误。
在开发的后期阶段,使用 -Wpedantic 来进一步提高代码的质量和安全性。
在生产环境中,使用 -Wall 或 -Wextra 来确保代码的稳定性。
cmake设置编译器警告方法
function(target_set_warnings TARGET ENABLED ENABLED_AS_ERRORS)
if (NOT ${ENABLED})
message(STATUS "Warnings Disabled for: ${TARGET}")
return()
endif()
set(MSVC_WARNINGS
/W4
/permissive-)
set(CLANG_WARNINGS
-Wall
-Wextra
-Wpedantic)
set(GCC_WARNINGS
${CLANG_WARNINGS})
if(${ENABLED_AS_ERRORS})
set(MSVC_WARNINGS ${MSVC_WARNINGS} /WX)
set(CLANG_WARNINGS ${CLANG_WARNINGS} -Werror)
set(GCC_WARNINGS ${GCC_WARNINGS} -Werror)
endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(WARNINGS ${MSVC_WARNINGS})
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(WARNINGS ${CLANG_WARNINGS})
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
set(WARNINGS ${GCC_WARNINGS})
endif()
target_compile_options(${TARGET} PRIVATE ${WARNINGS})
message(STATUS ${WARNINGS})
endfunction(target_set_warnings)
使用方法:
# 设置cmake模块的路径,存放上面函数的脚本名称为 enableWraning.txt,存放在cmake目录下:
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")
# 引入cmake的模块(xx.txt, xx就是模块名字)
include(enableWraning)