2017-04-26 75 views
2

我正在嘗試使用Microsoft Visual C++編譯器(以前的GCC和其他編譯器)編譯多平臺C++項目。使用_MSVC_LANG而不是__cplusplus安全嗎?

現在我遇到一些預處理器指令像這樣的:

#if __cplusplus < 201103L 
    // Define some macros of C++11 the code really relies on. 
    // [...] 
#endif 

雖然我使用Visual Studio 2015年,__cplusplus仍然被定義爲199711LThis post from the Microsoft blog建議檢查_MSVC_LANG

_MSVC_LANG >= 201402L不符合C++ 11的程度?

+3

檢查* *也,不*代替*(邏輯或)。 –

+0

好的,我編輯了它。 – WolfgangS

回答

1

首先,如果你想有一個便攜式的解決方法,你可以這樣做:

#if __cplusplus < 201103L && _MSVC_LANG < 201103L 
/* ... */ 
#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L 

你鏈接的評論指出,它是__cplusplus設置不正確的錯誤和測試_MSVC_LANG是一個權宜之計。但是,VC 2017(19.10.25017)與/std:c++14仍然將__cplusplus設置爲199711。我不確定這是否意味着C++ 14的支持仍然不完全,或者他們從來沒有接觸過。

_MSVC_LANG宏是Microsoft擴展。大多數其他編譯器不會設置它,以便更容易地測試編譯器是否爲Microsoft。 (一個例外:clang++ --std:c++14 -fms-compatibility-version=19.10同時設置__cplusplus_MSVC_LANG201402L,因爲這是它的MSVC兼容模式)。

相關問題