可能重複:
「Backporting」 nullptr to C++-pre-C++0x programs如何定義nullptr以支持C++ 03和C++ 11?
如何定義nullptr
爲同時支持C++ 03和C++ 11?
以下代碼是否與C++ 03和C++ 11一起編譯,而不改變C++ 11編譯器中nullptr的含義?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
可能重複:
「Backporting」 nullptr to C++-pre-C++0x programs如何定義nullptr以支持C++ 03和C++ 11?
如何定義nullptr
爲同時支持C++ 03和C++ 11?
以下代碼是否與C++ 03和C++ 11一起編譯,而不改變C++ 11編譯器中nullptr的含義?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
在C++ 11,nullptr
是nullptr_t
類型。其中一個比較NULL
(或0
會說Bjarne的,因爲他不喜歡宏)它的最大優勢是,這兩者之間的功能:
void foo(char*);
void foo(int);
foo(nullptr)
將調用char*
超載,但foo(NULL)
將調用int
超載。因此,您的解決方案可能適用於大多數情況,但您可能在函數超載時出錯。
當然不是* only *的優勢。你也可以在'nullptr_t'上重載,這非常有用。 –
模板參數推導推導'nullptr_t'爲'nullptr','int'爲'NULL'。 –
AFAIK您不能自動化從代碼中檢測到nullptr
的支持。
在實際應用中,你可以讀到作爲「不可能」,它’一個相當強大的「 AFAIK 」。
因此要做的事情是使用編譯器特定的代碼和/或構建命令。例如,在每個相關源添加
#include <cpp/nullptr.h>
和在構建命令調整包括路徑,使得對於編譯器nullptr
支持,這拿起一個空報頭,而對於舊的編譯器缺少nullptr
,它拿起一個標題,定義它在拉梅耶斯(說)。
然後測試非常徹底!
我稱之爲具有多個版本的標題的一般概念,其中只有一個由構建命令選擇,一個虛擬標題。圍繞這一點建立許多機制是可能的,包括只在更一般情況下才有意義的慣例。令人高興的是,對於這種特殊情況,這並不是必需的,但也許值得注意。
總結:使C++源代碼神奇地做事情不是去這裏的方式。在構建級別添加一些幫助似乎是正確的。 :-)
「AFAIK至少不能自動從代碼中檢測到nullptr支持」,而不是以涵蓋不合規編譯器的方式,實際上這些編譯器幾乎都是這些編譯器。在符合的編譯器上,你可以做到,因爲C++ 03編譯器保證不支持'nullptr'作爲關鍵字,而C++ 11編譯器則保證它不具備。所以你需要做的是檢查哪一個。 –
@Steve:是的。 :-) 呵呵 –
它正確嗎?不,不是。如果'NULL'等價於'nullptr',那麼首先就沒有理由引入這個特性。你問我們什麼?你的代碼是否會編譯*? –
檢查此解決方案:http://stackoverflow.com/questions/8747005/backporting-nullptr-to-c-pre-c0x-programs – Alexander
'定義(nullptr)'將失敗,因爲'nullptr'是關鍵字,而不是定義。 – Griwes