警告 - 已取消未引用的内联函数

时间:2016-05-30 14:19:19

标签: c++ visual-studio visual-studio-2015

我开始学习C ++并且读到增加警告级别是一个好主意,在编写代码时要更加小心。我使用的是Visual Studio 2015(社区版)

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

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

1 个答案:

答案 0 :(得分:13)

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

为了在命令行中使用Visual C ++,我通常使用以下环境变量:

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

显然现在可以自动抑制来自系统标头的警告,所以这不是问题。

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

  • <强>错误
    错误诊断意味着不会生成可执行文件(或目标文件)。

  • <强>警告
    警告诊断意味着某些事情可能是错误的,或者至少有些疑问,但假设您知道自己在做什么,编译器或链接器或其他工具继续进行。

您可以强制包含的相关MSVC特定标头(选项/FI),包括no 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)