2012-05-08 34 views
7

可能重複:
「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 
+5

它正確嗎?不,不是。如果'NULL'等價於'nullptr',那麼首先就沒有理由引入這個特性。你問我們什麼?你的代碼是否會編譯*? –

+4

檢查此解決方案:http://stackoverflow.com/questions/8747005/backporting-nullptr-to-c-pre-c0x-programs – Alexander

+7

'定義(nullptr)'將失敗,因爲'nullptr'是關鍵字,而不是定義。 – Griwes

回答

10

在C++ 11,nullptrnullptr_t類型。其中一個比較NULL(或0會說Bjarne的,因爲他不喜歡宏)它的最大優勢是,這兩者之間的功能:

void foo(char*); 
void foo(int); 

foo(nullptr)將調用char*超載,但foo(NULL)將調用int超載。因此,您的解決方案可能適用於大多數情況,但您可能在函數超載時出錯。

+7

當然不是* only *的優勢。你也可以在'nullptr_t'上重載,這非常有用。 –

+3

模板參數推導推導'nullptr_t'爲'nullptr','int'爲'NULL'。 –

8

AFAIK您不能自動化從代碼中檢測到nullptr的支持。

在實際應用中,你可以讀到作爲「不可能」,它’一個相當強大的「 AFAIK 」。

因此要做的事情是使用編譯器特定的代碼和/或構建命令。例如,在每個相關源添加

#include <cpp/nullptr.h> 

和在構建命令調整包括路徑,使得對於編譯器nullptr支持,這拿起一個空報頭,而對於舊的編譯器缺少nullptr,它拿起一個標題,定義它在拉梅耶斯(說)。

然後測試非常徹底!

我稱之爲具有多個版本的標題的一般概念,其中只有一個由構建命令選擇,一個虛擬標題。圍繞這一點建立許多機制是可能的,包括只在更一般情況下才有意義的慣例。令人高興的是,對於這種特殊情況,這並不是必需的,但也許值得注意。

總結:使C++源代碼神奇地做事情不是去這裏的方式。在構建級別添加一些幫助似乎是正確的。 :-)

+1

「AFAIK至少不能自動從代碼中檢測到nullptr支持」,而不是以涵蓋不合規編譯器的方式,實際上這些編譯器幾乎都是這些編譯器。在符合的編譯器上,你可以做到,因爲C++ 03編譯器保證不支持'nullptr'作爲關鍵字,而C++ 11編譯器則保證它不具備。所以你需要做的是檢查哪一個。 –

+0

@Steve:是的。 :-) 呵呵 –