Visual C ++编译器选项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Visual C ++编译器选项相关的知识,希望对你有一定的参考价值。
我需要确保在发生隐式转换时,编译器应该抛出警告/错误,如下面的代码所示:
int32_t y = 9;
uint32_t x = y;
y = -1;
x = y;
在gcc中,我可以一起使用-Wconversion -Wsign-conversion编译器标志来报告这样的问题 - VC ++构建是否有类似的选项?
答案
见Compiler Warnings That Are Off by Default
- C4287(3级)'运算符':无符号/负常数不匹配
- C4365(第4级)'操作':从'type_1'转换为'type_2',签名/未签名不匹配
- C4388(4级)有符号/无符号不匹配
- C4287(3级)'运算符':无符号/负常数不匹配
还有其他与截断有关。
通常你会使用/Wall
打开所有警告然后根据你的代码建立一个抑制列表来使用它们,因为很多这些都是非常嘈杂的。
例如,在DirectX Tool Kit for DX11中,我在/Wall
中使用pch.h
和以下抑制:
// VS 2013 related Off by default warnings
#pragma warning(disable : 4619 4616 4350 4351 4472 4640 5038)
// C4619/4616 #pragma warning warnings
// C4350 behavior change
// C4351 behavior change; warning removed in later versions
// C4472 'X' is a native enum: add an access specifier (private/public) to declare a WinRT enum
// C4640 construction of local static object is not thread-safe
// C5038 can't use strictly correct initialization order due to Dev12 initialization limitations
// Off by default warnings
#pragma warning(disable : 4061 4265 4365 4571 4623 4625 4626 4628 4668 4710 4711 4746 4774 4820 4987 5026 5027 5031 5032 5039)
// C4061 enumerator 'X' in switch of enum 'X' is not explicitly handled by a case label
// C4265 class has virtual functions, but destructor is not virtual
// C4365 signed/unsigned mismatch
// C4571 behavior change
// C4623 default constructor was implicitly defined as deleted
// C4625 copy constructor was implicitly defined as deleted
// C4626 assignment operator was implicitly defined as deleted
// C4628 digraphs not supported
// C4668 not defined as a preprocessor macro
// C4710 function not inlined
// C4711 selected for automatic inline expansion
// C4746 volatile access of '<expression>' is subject to /volatile:<iso|ms> setting
// C4774 format string expected in argument 3 is not a string literal
// C4820 padding added after data member
// C4987 nonstandard extension used
// C5026 move constructor was implicitly defined as deleted
// C5027 move assignment operator was implicitly defined as deleted
// C5031/5032 push/pop mismatches in windows headers
// C5039 pointer or reference to potentially throwing function passed to extern C function under - EHc
// Windows 8.1 SDK related Off by default warnings
#pragma warning(disable : 4471 4917 4986 5029)
// C4471 forward declaration of an unscoped enumeration must have an underlying type
// C4917 a GUID can only be associated with a class, interface or namespace
// C4986 exception specification does not match previous declaration
// C5029 nonstandard extension used
它确实有一个维护成本,以跟上编译器随时间的变化,这也是为什么我有评论提醒我每个人的用途。
以上是关于Visual C ++编译器选项的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2012 和 2010 中基于 Opengl Sierpinski Shader 的 C 代码
哪些编译器选项用于在 Visual Studio 中编译 C++ STL 类/函数?