我开始学习C++,并且认为增加警告级别是编写代码时更谨慎的好主意。我正在使用Visual Studio 2015(社区版)警告 - 未引用的内联函数已被删除
但是,这样做后,即使在基本程序中,我也会收到数百个错误(编辑:警告视为错误,对不起)。这些都来自数学头,他们说“未引用的内联函数已被删除”。似乎每个我不使用的方法都会引发警告。
为什么会发生这种情况,我该如何解决?
我开始学习C++,并且认为增加警告级别是编写代码时更谨慎的好主意。我正在使用Visual Studio 2015(社区版)警告 - 未引用的内联函数已被删除
但是,这样做后,即使在基本程序中,我也会收到数百个错误(编辑:警告视为错误,对不起)。这些都来自数学头,他们说“未引用的内联函数已被删除”。似乎每个我不使用的方法都会引发警告。
为什么会发生这种情况,我该如何解决?
使用Visual C++,您应该使用/W4
而不是/Wall
这是不切实际的。如果警告级别4仍然产生愚蠢警告,例如从标准的标题,然后考虑使用我的旧MSVC "no sillywarnings" header,或它的一个合适的扩展。最好通过强制包含编译器选项。
对于在命令行中我一般使用以下环境变量使用Visual C++的工作:
CL=/nologo /EHsc /GR /W4 /FI "iso646.h"
显然现在有系统头文件的警告自动抑制,所以它不是一个问题。
请注意,在神圣的C++标准并没有不同种类的诊断区分,作为事实上标准C++编译器和链接区分
之间错误:
错误诊断意味着不生成可执行文件(或对象文件)。
警告:
一个警告诊断手段的东西很可能是错误的,或者至少是有些怀疑,但是编译器或链接或其他工具就假设你知道你在做什么进行。
相关MSVC特有的头强行包括(选项/FI
)在内的多了起来,以无sillywarnings的最新版本标题:
#pragma once
// p/cppx/core_language_support/compiler_specific/msvc_less_errors_as_warnings_please.hpp
// Copyright © Alf P. Steinbach 2015. Boost Software License 1.0.
#ifndef _MSC_VER
# error This file is specific to the MSVC (Microsoft Visual C++) compiler.
#endif
#pragma warning(error: 4566) // Character ... cannot be represented -- is error.
#pragma warning(error: 4627) // Source code has been ignored – is error.
msvc_more_warnings_please.hpp
#pragma once
// p/cppx/core_language_support/compiler_specific/msvc_more_warnings_please.hpp
// Copyright © Alf P. Steinbach 2015. Boost Software License 1.0.
#ifndef _MSC_VER
# error This file is specific to the MSVC (Microsoft Visual C++) compiler.
#endif
#pragma warning(push, 4) // Warning level 4 (max). MSVC /Wall is impractical.
msvc_no_sillywarnings_please.hpp
#pragma once
// p/cppx/core_language_support/compiler_specific/msvc_no_sillywarnings_please.hpp
// Copyright © Alf P. Steinbach 2010 – 2015. Boost Software License 1.0.
#ifndef _MSC_VER
# error This file is specific to the MSVC (Microsoft Visual C++) compiler.
#endif
#ifndef CPPX_ALLOW_WP64
# // The /Wp64 option generates spurious warnings when a __w64 type argument selects
# // a correct overload with non-__w64 formal argument type, i.e. for <<. In newer
# // versions of MSVC this option is deprecated. It Really Annoyed a lot of people!
# ifdef _Wp64
# error Do not use the /Wp64 option: use a 64-bit compiler to detect 64-bit portability issues.
# endif
#endif
// The following are real warnings but are generated by almost all MS headers, including
// standard library headers, so it's impractical to leave them on.
#pragma warning(disable: 4619) // there is no warning number 'XXXX'
#pragma warning(disable: 4668) // XXX is not defined as a preprocessor macro
// The following are pure sillywarnings:
#pragma warning(disable: 4061) // enum value is not *explicitly* handled in switch
#pragma warning(disable: 4063) // case 'nn' is not a valid value for switch of enum 'Name'
#pragma warning(disable: 4099) // first seen using 'struct' now seen using 'class'
#pragma warning(disable: 4127) // conditional expression is constant
#pragma warning(disable: 4180) // qualifier applied to function type has no meaning
#pragma warning(disable: 4217) // member template isn't copy constructor
#pragma warning(disable: 4250) // inherits (implements) some member via dominance
#pragma warning(disable: 4251) // needs to have dll-interface to be used by clients
#pragma warning(disable: 4275) // exported class derived from non-exported class
#pragma warning(disable: 4347) // "behavior change", function called instead of template
#pragma warning(disable: 4355) // "'this': used in member initializer list
#pragma warning(disable: 4373) // override when arg types differ by const/volatile qualifiers
#pragma warning(disable: 4428) // MSVC 9: universal-character-name encountered in source
#pragma warning(disable: 4459) // local declaration hides global declaration
#pragma warning(disable: 4505) // unreferenced function has been removed
#pragma warning(disable: 4510) // default constructor could not be generated
#pragma warning(disable: 4511) // copy constructor could not be generated
#pragma warning(disable: 4512) // assignment operator could not be generated
#pragma warning(disable: 4513) // destructor could not be generated
#pragma warning(disable: 4610) // can never be instantiated user defined constructor required
#pragma warning(disable: 4623) // default constructor could not be generated
#pragma warning(disable: 4624) // destructor could not be generated
#pragma warning(disable: 4625) // copy constructor could not be generated
#pragma warning(disable: 4626) // assignment operator could not be generated
#pragma warning(disable: 4640) // a local static object is not thread-safe
#pragma warning(disable: 4646) // noreturn function should have a void return type
#pragma warning(disable: 4661) // a member of the template class is not defined.
#pragma warning(disable: 4670) // a base class of an exception class is inaccessible for catch
#pragma warning(disable: 4672) // a base class of an exception class is ambiguous for catch
#pragma warning(disable: 4673) // a base class of an exception class is inaccessible for catch
#pragma warning(disable: 4675) // resolved overload was found by argument-dependent lookup
#pragma warning(disable: 4702) // unreachable code, e.g. in <list> header.
#pragma warning(disable: 4710) // call was not inlined
#pragma warning(disable: 4711) // call was inlined
#pragma warning(disable: 4820) // some padding was added
#pragma warning(disable: 4917) // a GUID can only be associated with a class, interface or namespace
#pragma warning(disable: 4996) // MSVC 9: a C stdlib function has been "deprecated" (says MS)
请出示一些您收到这些错误。 –
唯一的解决方法就是不使用'/ WAll'。 – alain
你不能*“发现错误”*。错误是错误,不能决定什么是错误,什么是错误(只有例外:*将警告视为错误*选项)。您可以增加*警告*级别。如果这是你所指的,请更新你的问题。 – IInspectable