2016-05-30 223 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)