编译器警告介绍:
编译器警告是编译器在编译代码时发出的警告,它表示代码中存在潜在的错误或问题。编译器警告不是错误,编译器仍然会生成可执行文件,但警告表示代码可能存在问题,需要开发人员注意。
编译器警告需要是因为代码中存在潜在的错误或问题,如果不及时发现和解决,可能会导致程序运行时崩溃、数据丢失或其他问题。编译器警告可以帮助开发人员在代码编写阶段发现这些潜在的问题,从而提高代码的质量和可靠性。
建议在开发过程中使用 -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)