2010-09-21 7 views

Antwort

19

GCC 4.4.1 nicht nullptr unterstützen.

Unterstützung für nullptr wurde in GCC 4.6.0 hinzugefügt: http://gcc.gnu.org/gcc-4.6/changes.html

Verbesserte experimentelle Unterstützung für die kommenden C++ 0x ISO C++ Standard einschließlich der Unterstützung für nullptr (dank Magnus Fromreide), noexcept, uneingeschränkte Verbindungen, bereichsbasierte für Schleifen (dank Rodrigo Rivas Costa), implizit gelöschte Funktionen und implizite Move Konstruktoren.

Für frühere Versionen von GCC, wenn Sie mit nullptr experimentieren möchten, können Sie die Abhilfe in dieser Frage SO versuchen:

Can nullptr be emulated in GCC?

+0

Ich bin mit GCC und g ++ 4.8 und ich kann nullptr nicht gefunden ..... – user997112

+10

hinzufügen -std = C++ 11 bis Sie GCC-Befehlszeile. – sjaensch

+2

Da pre GCC 4.6 keine nullptr hat, können Sie "__null" verwenden –

3

würde ich empfehlen nullptr nicht, wie oben definiert, weil es kann gefährlich sein. Wenn Sie nullptr verwenden möchten, sollte die folgende Aussage wahr sein.

sizeof(nullptr) == sizeof(void*) == sizeof(any pointer) 

jedoch sizeof(nullptr) (wie oben definiert) nicht von dieser Regel entsprechen. Es wird tatsächlich zu sizeof(bad nullptr) = 1 ausgewertet.

Dies ist eine korrekte Implementierung.

#pragma once 

namespace std 
{ 
    //based on SC22/WG21/N2431 = J16/07-0301 
    struct nullptr_t 
    { 
     template<typename any> operator any *() const 
    { 
     return 0; 
    } 
    template<class any, typename T> operator T any:: *() const 
    { 
     return 0; 
    } 

#ifdef _MSC_VER 
    struct pad {}; 
    pad __[sizeof(void*)/sizeof(pad)]; 
#else 
    char __[sizeof(void*)]; 
#endif 
private: 
    // nullptr_t();// {} 
    // nullptr_t(const nullptr_t&); 
    // void operator = (const nullptr_t&); 
    void operator &() const; 
    template<typename any> void operator +(any) const 
    { 
     /*I Love MSVC 2005!*/ 
    } 
    template<typename any> void operator -(any) const 
    { 
     /*I Love MSVC 2005!*/ 
    } 
    }; 
static const nullptr_t __nullptr = {}; 
} 

#ifndef nullptr 
#define nullptr std::__nullptr 
#endif 
+0

vielleicht sollten Sie auch sicherstellen, dass die Ausrichtung auch korrekt ist, wenn dies für Sie wichtig ist –

+3

Yaroslav, sollten Sie vielleicht in Betracht ziehen, ohne zu schreien. :) –

2

Ich benutze -std = C++ 0x die nullptr Funktion mit gcc 4.6.3

+0

Aber -std = C++ 0x aktiviert nicht nullptr in Gcc 4.4.x –

2

aktivieren Wenn Sie die neueste gcc nicht haben, die C++ 11 unterstützt, versuchen Sie NULL statt mit von nullptr.

Verwandte Themen