2016-03-25 16 views
1

Ich verwende std::getenv Anruf in meinem Code und ich bin mir nicht sicher über diese drei Möglichkeiten -NULL vs nullptr in einem portierten c Header

const char *env_p = std::getenv("SOME_ENV"); 

if(env_p == NULL){ 
    std::cout << "NULL caught"; 
} 

if(env_p == 0){ 
    std::cout << "0 caught"; 
} 

if(env_p == nullptr){ 
    std::cout <<"nullptr caught"; 
} 

den einer von ihnen soll ich verwenden? Ich war mehr geneigt in Richtung nullptr Version seit C++ empfiehlt es, aber seit cstdlib war ursprünglich eine c-Header, ich bin nicht sicher, für NULL oder 0 oder nullptr zu überprüfen.

Ich habe ein Programm zu überprüfen und alle drei wurden abgefangen, weil es keine env-Variable mit dem obigen Namen gab. Also gibt mir das die Wahl, dass ich irgendjemanden von ihnen oder sogar if(!env_p) richtig benutzen könnte?

Aber ich bin nicht so sicher, da dies möglicherweise nur für dieses Beispiel oder Maschine abhängig oder etwas, das ich vermisse, funktioniert. Also kann jeder diesen Fall bestätigen?

Thankyou

+1

'nullptr' wird natürlich mit jedem Zeiger arbeiten, sogar diejenigen, die Sie an C-Funktionen übergeben, wo es 'NULL' sein wird. –

Antwort

2

In Ihrem Fall sind sie alle gleich. Ein Nullzeiger ist ein Zeiger mit einem magischen Wert, der keinem Zeiger auf tatsächliche Daten entspricht. In der Regel sehen wir ihn als Adresse 0, und die meisten Implementierungen verwenden die Adresse 0, um einen Nullzeiger darzustellen, aber das ist ein Implementierungsdetail.

if (env_p == 0) 

Diese wörtliche 0 wird auf einen Zeiger verglichen wird, so dass der Compiler wird es in einen Zeiger umwandeln. Eine literale Null, die in einen Zeiger umgewandelt wird, führt zu einem Nullzeiger, weil die Standards dies sagen.Diese

if (env_p == NULL) 

ist effektiv die gleiche Sache, weil in fast allen Implementierungen NULL ist ein Makro 0 sein definiert. (Eine Zeit lang war es nicht ungewöhnlich, C NULL als (void*)0 zu definieren, aber das ist nicht mehr in der Art aus Gründen, die nicht wichtig sind hier.)

if (env_p == nullptr) 

nullptr ist ein C++ Schlüsselwort, das Ihnen ein Null gibt Zeiger mit einem speziellen Typ. Aber es ist immer noch ein Nullzeiger, also macht es genau das, was Sie wollen.

Es gibt Fälle, in C++ (wie perfekt Forwarding), wo Sie nullptr statt NULL oder 0 verwenden müssen, um sicherzustellen, dass Sie einen Null-Zeiger haben (anstelle eines int, die 0 sein geschieht), um Typ Abzug, um sicherzustellen, wählt die Instanziierung oder Überlastung der Schreibvorlage.

Schließlich gemeinsame Idiome für Zeiger Überprüfung sind:

if (env_p) { ... } // true if not a null pointer 
if (!env_p) { ... } // true if a null pointer 

Das funktioniert, weil es eine implizite Vergleich auf Ungleichheit zu 0. Das heißt, sie werden genauso behandelt, als ob Sie geschrieben hatte:

if ((env_p) != 0) { ... } 
if ((!env_p) != 0) { ... } 

So funktioniert es aus den oben genannten Gründen. In C++ verwende ich nullptr für Nullzeiger. In C oder in Code, der in beiden Modi kompiliert werden kann, verwende ich normalerweise NULL, weil es die Absicht ein wenig klarer macht als die Verwendung von 0.

1

Kurze Antwort: Sie sind alle gleich, können Sie sie austauschbar verwendet werden.

Etwas längere Antwort:

std::getenv liefert einen NULL pointer wenn es fehlschlägt:

Zeichenfolge den Wert der Umgebungsvariable Identifizierung oder Nullzeiger wenn eine solche Variable nicht gefunden wird.

Wenn Sie überprüfen wollen, ob die Funktion fehlgeschlagen ist, können Sie entweder von diesen verwenden:

  • if (env_p == NULL) definiert als 0 (#define NULL 0)
  • if (env_p == 0) das gleiche
  • ist
  • if (env_p == nullptr) a C++ Art und Weise es zu tun - sicher (kann nur mit Zeigern verglichen werden)
  • if (!env_p) ist nur true, wenn env_p ist false, so ist es das gleiche wie env_p == 0

Überprüfung Wenn Sie moderne C++ verwenden, ich nullptr bleiben würde.