2013-04-14 86 views
11

我想在我的程序中使用一些C++ 11功能。將來我可能不得不與其他人分享我的源代碼。 如何在代碼中聲明應該使用C++ 11編譯我的程序?較舊的編譯器可能會引發錯誤,但我希望清楚地通知用戶需要C++ 11。如何聲明應該使用C++ 11來編譯我的程序?

我使用以下C++ 11的功能,如果該事項:

  • 枚舉與存儲大小指定
  • STD共享指針

感謝

+4

'static_assert(true);'。 (我在開玩笑,不要這樣做) – jamesdlin

+0

請注意,在撰寫本文時,沒有完全支持C++ 11的編譯器。因此,如果您測試完整的C++ 11支持,則會產生大量的錯誤否定結果 - 編譯器具有您需要的功能,但不會實現C++ 11,因此被測試拒絕。 –

+0

@SteveJessop我覺得GCC已經支持所有的C++ 11功能,根據[this table](http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport)。如果我錯了,請糾正我。 – Malcolm

回答

22

你可以檢查__cplusplus宏的值是201103L或更大:

#if __cplusplus < 201103L 
#error This code requires C++11 
#endif 

C++ 11 16.8 Prede網絡斯內德宏名稱:

下面的宏名稱應由實施定義:

__cplusplus

當編譯C++翻譯單元時,名稱__cplusplus被定義爲值201103L。 (155)

(155)這個標準的未來版本打算用更大的值代替這個宏的值。不合格 編譯器應該使用一個至多有5位小數的值。

+0

我應該使用類似#if _cplusplus == 201103L {我的代碼} #elif {顯示錯誤}嗎? –

+0

@NehaKaranjkar:不要比較平等。我用一個例子更新了答案。 – NPE

+0

我剛剛瞭解到#error指令。謝謝。這兩個答案都提到+1。 –

9

__cplusplus宏可能會得心應手

#if __cplusplus < 201103L 
#error C++11 Required 
#endif 

像這樣的事情

+2

該示例結構能夠工作,但我會去檢查比C++ 11更低的值。 – chris

+0

-1這不是未來的證明,如果C++ 14/17出現了,該怎麼辦? – TemplateRex

+0

@rhalbersma:我同意你觀察的技術性,但我真的不認爲很快就會有另一個批准。 C++ 03 ---> C++ 11,8 years ha .. –

5

正如已經說過的,正確的解決方案是檢查__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
相關問題