2016-05-30 224 views
6

我开始学习C++,并且认为增加警告级别是编写代码时更谨慎的好主意。我正在使用Visual Studio 2015(社区版)警告 - 未引用的内联函数已被删除

但是,这样做后,即使在基本程序中,我也会收到数百个错误(编辑:警告视为错误,对不起)。这些都来自数学头,他们说“未引用的内联函数已被删除”。似乎每个我不使用的方法都会引发警告。

为什么会发生这种情况,我该如何解决?

+1

请出示一些您收到这些错误。 –

+0

唯一的解决方法就是不使用'/ WAll'。 – alain

+0

你不能*“发现错误”*。错误是错误,不能决定什么是错误,什么是错误(只有例外:*将警告视为错误*选项)。您可以增加*警告*级别。如果这是你所指的,请更新你的问题。 – IInspectable

回答

11

使用Visual C++,您应该使用/W4而不是/Wall这是不切实际的。如果警告级别4仍然产生愚蠢警告,例如从标准的标题,然后考虑使用我的旧MSVC "no sillywarnings" header,或它的一个合适的扩展。最好通过强制包含编译器选项。

对于在命令行中我一般使用以下环境变量使用Visual C++的工作:

 
CL=/nologo /EHsc /GR /W4 /FI "iso646.h" 

显然现在有系统头文件的警告自动抑制,所以它不是一个问题。


请注意,在神圣的C++标准并没有不同种类的诊断区分,作为事实上标准C++编译器和链接区分

之间
  • 错误
    错误诊断意味着不生成可执行文件(或对象文件)。

  • 警告
    一个警告诊断手段的东西很可能是错误的,或者至少是有些怀疑,但是编译器或链接或其他工具就假设你知道你在做什么进行。

    可以

相关MSVC特有的头强行包括(选项/FI)在内的多了起来,以无sillywarnings的最新版本标题:

msvc_less_errors_as_warnings_please.hpp
#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)