2010-03-10 88 views
46

我看到在Visual Studio 2010中實現了nullptr。我喜歡這個概念,並希望儘快開始使用它;但是GCC目前還不支持它。我的代碼需要同時運行(但不必與其他編譯器一起編譯)。可以在gcc中模擬nullptr嗎?

有沒有辦法「模仿」它?喜歡的東西:

#define nullptr NULL 

(這顯然不會都很好地工作,它只是爲了說明我的意思。)

回答

60

The Official proposal有一個解決方法 -

const      // this is a const object... 
class { 
public: 
    template<class T>   // convertible to any type 
    operator T*() const  // of null non-member 
    { return 0; }   // pointer... 
    template<class C, class T> // or any type of null 
    operator T C::*() const // member pointer... 
    { return 0; } 
private: 
    void operator&() const; // whose address can't be taken 
} nullptr = {};    // and whose name is nullptr 
+3

謝謝。你是否也知道是否有辦法檢測'nullptr'是否被實現,而不依賴於__cplusplus的版本(因爲技術上我使用的是C++ 0x,而nullptr不在那裏) – nuzz 2010-03-10 19:33:40

+10

@nuzz:那麼你是不是不使用C++ 0x。 :) – Bill 2010-03-10 19:34:33

+3

那麼,我使用的是C++ 0x的一部分;) – nuzz 2010-03-10 20:01:31

8

它看起來像GCC從4.6支持nullptr。

6

此外,gcc(實際上是g ++)多年來有一個擴展__null。當nullptr提案出來時,這被視爲行業實施經驗。

__null擴展可以檢測到特殊情況並警告它們,例如意外傳遞NULL給bool參數,當它打算傳遞給指針參數時(對功能所做的更改,忘記調整呼叫端) 。

當然這不是便攜式的。上述模板解決方案是便攜式的。

+0

__null正是爲gcc定義的NULL,它用於發出警告。它與使用NULL沒有區別,並且不具有與nullptr相同的語義。 – rdb 2016-12-03 20:53:43

4

它看起來像gcc 4.6.1(Ubuntu 11.11 oneiric),nullptr已被添加。

快速,遞歸我的HPP/cpp文件SED查找和替換工作對我罰款:

find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g' 
2

這很可能是您忘記-std = C++ 0x中。 我的Mingw版本的gcc是4.6.1/4.7.1,都支持nullptr。

根據「C++標準庫中的教程和參考文獻2」中的描述,nullptr是一個關鍵字,可以自動轉換爲每個指針類型而不是整數類型,這克服了NULL的缺點,這對於模糊下面的超載函數: void f(int); void f(void *);

f(NULL); //模糊 f(nullptr); // OK

測試此功能在VC2010表明,與實際的編譯文件MSDN衝突,文件說:

的nullptr關鍵字是不是一個類型的,並且不支持使用:

的sizeof

typeid的

擲nullptr

其實在VC2010,上述所有運營商/快遞離子是合法的。 sizeof(nullptr)結果4. typeid.name()結果std :: nullptr_t和throw nullptr可以被「const void *」和「void *」(以及其他指針類型)捕獲。

雖然gcc(4.7.1)看起來比較偏硬一點,但nullptr不能被「void *」捕獲,可以被'...捕獲'

+3

不,從gcc剛剛不支持'nullptr'的時候,這個問題很可能已經有2年了。但4.6支持它的答案實際上已經是1.5歲了。所以我想你的「答案」已經完全過時了。 – 2012-06-28 07:31:09

相關問題