我想在我的程序中使用一些C++ 11功能。將來我可能不得不與其他人分享我的源代碼。 如何在代碼中聲明應該使用C++ 11編譯我的程序?較舊的編譯器可能會引發錯誤,但我希望清楚地通知用戶需要C++ 11。如何聲明應該使用C++ 11來編譯我的程序?
我使用以下C++ 11的功能,如果該事項:
- 枚舉與存儲大小指定
- STD共享指針
感謝
我想在我的程序中使用一些C++ 11功能。將來我可能不得不與其他人分享我的源代碼。 如何在代碼中聲明應該使用C++ 11編譯我的程序?較舊的編譯器可能會引發錯誤,但我希望清楚地通知用戶需要C++ 11。如何聲明應該使用C++ 11來編譯我的程序?
我使用以下C++ 11的功能,如果該事項:
感謝
你可以檢查__cplusplus
宏的值是201103L
或更大:
#if __cplusplus < 201103L
#error This code requires C++11
#endif
C++ 11 16.8 Prede網絡斯內德宏名稱:
下面的宏名稱應由實施定義:
__cplusplus
當編譯C++翻譯單元時,名稱
__cplusplus
被定義爲值201103L
。 (155)(155)這個標準的未來版本打算用更大的值代替這個宏的值。不合格 編譯器應該使用一個至多有5位小數的值。
我應該使用類似#if _cplusplus == 201103L {我的代碼} #elif {顯示錯誤}嗎? –
@NehaKaranjkar:不要比較平等。我用一個例子更新了答案。 – NPE
我剛剛瞭解到#error指令。謝謝。這兩個答案都提到+1。 –
該示例結構能夠工作,但我會去檢查比C++ 11更低的值。 – chris
-1這不是未來的證明,如果C++ 14/17出現了,該怎麼辦? – TemplateRex
@rhalbersma:我同意你觀察的技術性,但我真的不認爲很快就會有另一個批准。 C++ 03 ---> C++ 11,8 years ha .. –
正如已經說過的,正確的解決方案是檢查__cplusplus
宏。但是,某些編譯器對C++ 11功能有部分支持,但不要將此宏設置爲正確的值。例如,自GCC 4.4.0以來,強類型枚舉在g ++中可用。但是,通過選項-std=c++11
(及其等效值),在GCC 4.7.0之前,宏__cplusplus
未設置爲良好值(而是將其設置爲1)。這意味着一些編譯器可以編譯你的代碼,但是如果你用這種方式檢查C++ 11就不會。
如果你只是需要特定的功能,那麼我會用Boost.Config來檢查它們,它定義a whole set of macros,它可以用來檢查你的編譯器是否支持所需的功能。在你的情況下,你需要:
BOOST_NO_CXX11_SCOPED_ENUMS
爲強類型的枚舉。BOOST_NO_CXX11_SMART_PTR
對於std::shared_ptr
。
'static_assert(true);'。 (我在開玩笑,不要這樣做) – jamesdlin
請注意,在撰寫本文時,沒有完全支持C++ 11的編譯器。因此,如果您測試完整的C++ 11支持,則會產生大量的錯誤否定結果 - 編譯器具有您需要的功能,但不會實現C++ 11,因此被測試拒絕。 –
@SteveJessop我覺得GCC已經支持所有的C++ 11功能,根據[this table](http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport)。如果我錯了,請糾正我。 – Malcolm