我看到在Visual Studio 2010中實現了nullptr
。我喜歡這個概念,並希望儘快開始使用它;但是GCC目前還不支持它。我的代碼需要同時運行(但不必與其他編譯器一起編譯)。可以在gcc中模擬nullptr嗎?
有沒有辦法「模仿」它?喜歡的東西:
#define nullptr NULL
(這顯然不會都很好地工作,它只是爲了說明我的意思。)
我看到在Visual Studio 2010中實現了nullptr
。我喜歡這個概念,並希望儘快開始使用它;但是GCC目前還不支持它。我的代碼需要同時運行(但不必與其他編譯器一起編譯)。可以在gcc中模擬nullptr嗎?
有沒有辦法「模仿」它?喜歡的東西:
#define nullptr NULL
(這顯然不會都很好地工作,它只是爲了說明我的意思。)
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
它看起來像GCC從4.6支持nullptr。
此外,gcc(實際上是g ++)多年來有一個擴展__null。當nullptr提案出來時,這被視爲行業實施經驗。
__null擴展可以檢測到特殊情況並警告它們,例如意外傳遞NULL給bool參數,當它打算傳遞給指針參數時(對功能所做的更改,忘記調整呼叫端) 。
當然這不是便攜式的。上述模板解決方案是便攜式的。
__null正是爲gcc定義的NULL,它用於發出警告。它與使用NULL沒有區別,並且不具有與nullptr相同的語義。 – rdb 2016-12-03 20:53:43
它看起來像gcc 4.6.1(Ubuntu 11.11 oneiric),nullptr已被添加。
快速,遞歸我的HPP/cpp文件SED查找和替換工作對我罰款:
find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g'
這很可能是您忘記-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 *」捕獲,可以被'...捕獲'
不,從gcc剛剛不支持'nullptr'的時候,這個問題很可能已經有2年了。但4.6支持它的答案實際上已經是1.5歲了。所以我想你的「答案」已經完全過時了。 – 2012-06-28 07:31:09
謝謝。你是否也知道是否有辦法檢測'nullptr'是否被實現,而不依賴於__cplusplus的版本(因爲技術上我使用的是C++ 0x,而nullptr不在那裏) – nuzz 2010-03-10 19:33:40
@nuzz:那麼你是不是不使用C++ 0x。 :) – Bill 2010-03-10 19:34:33
那麼,我使用的是C++ 0x的一部分;) – nuzz 2010-03-10 20:01:31