2016-04-07 43 views
5

Mi piace usare nullptr anziché NULL. Ora chiamo una funzione C (da libjansson in questo caso).C NULL uguale a C++ 11 nullptr

NULL in C è l'implementazione defined.

Per nullptr Ho trovato che "Una costante di puntatore nullo è un'espressione di costante integrale (5.19) valore di tipo intero che viene valutata a zero".

Quindi la cosa più sicura da fare:

auto string_obj=json_object_get(m_handle,name); 
if(string_obj!=NULL) 
    { 
    auto string=json_string_value(string_obj); 
    if(string!=NULL) 
     {return string;} 
    } 
return nullptr; 

Ho veramente bisogno di questo o posso fare più semplice:

auto string_obj=json_object_get(m_handle,name); 
if(string_obj!=nullptr) 
    { 
    return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr 
    } 
return nullptr; 
+0

Scegliere la lingua. La lingua quindi ti dice cosa usare. Non è possibile mix-n-match –

+6

@EdHeal: questa è una domanda di interoperabilità. – user877329

+0

Per le funzioni C chiamate da C++ si utilizza NULL in argomenti come appropriato. Altrimenti usa nullptr. Se si passa da C++ a C, fare 'v == nullptr? NULL: v' e viceversa –

risposta

17

In C++ 11 e oltre, un puntatore che è ==NULL sarà anche ==nullptr e viceversa.

Gli usi di NULL diversi dal confronto con un puntatore (come utilizzarlo per rappresentare il byte nul alla fine di una stringa) non funzioneranno con nullptr.

In alcuni casi, NULL è #define NULL 0, poiché la costante intera 0 è di tipo speciale in C e C++ quando la si confronta con i puntatori. Queste informazioni di tipo non di tipo causano alcuni problemi sia in C che in C++, quindi in C++ hanno deciso di creare un tipo e un valore speciali che fanno la stessa cosa nei casi di uso "appropriati" e non riescono a compilare in modo affidabile nella maggior parte dei " casi d'uso "impropri".

Nella misura in cui l'implementazione C++ è compatibile con l'implementazione C con cui si interpone (molto raro che ciò non sia vero), tutto dovrebbe funzionare.


essere molto chiaro, se ptr è un qualsiasi tipo di puntatore, quindi le seguenti espressioni sono equivalenti in C++:

ptr == nullptr 
ptr == NULL 
ptr == 0 
!ptr 

come lo sono le seguenti:

ptr = nullptr 
ptr = NULL 
ptr = 0 

e se X è un tipo, così sono le seguenti dichiarazioni:

X* ptr = nullptr; 
X* ptr = NULL; 
X* ptr = 0; 

nullptr differisce quando si passa ad una funzione di modello che deduce digitare (o NULL0 diventare un int a meno che non passato a un argomento in attesa di un puntatore, mentre nullptr resta un nullptr_t), e quando viene utilizzato in alcuni contesti in cui non sarà nullptr compilare (come char c = NULL;) (nota, non char* c=NULL;)