我開始學習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