J’aime utiliser nullptr
au lieu de NULL. Maintenant, j’appelle une fonction C (de libjansson
dans ce cas).
NULL
en C est une implémentation définie .
Pour nullptr
j’ai trouvé qu ‘”une constante de pointeur nulle est une expression constante intégrale (5.19) rvalue de type entier qui est évaluée à zéro”.
Donc, la chose la plus sûre à faire:
auto ssortingng_obj=json_object_get(m_handle,name); if(ssortingng_obj!=NULL) { auto ssortingng=json_ssortingng_value(ssortingng_obj); if(ssortingng!=NULL) {return ssortingng;} } return nullptr;
Ai-je vraiment besoin de cela ou puis-je le faire plus simplement:
auto ssortingng_obj=json_object_get(m_handle,name); if(ssortingng_obj!=nullptr) { return json_ssortingng_value(ssortingng_obj); //Assume there is no difference between C NULL and C++11 nullptr } return nullptr;
En C ++ 11 et au-delà, un pointeur ==NULL
sera également ==nullptr
et inversement.
Les utilisations de NULL
autres que la comparaison avec un pointeur (similaire à celui utilisé pour représenter l’octet nul à la fin d’une chaîne) ne fonctionneront pas avec nullptr
.
Dans certains cas, NULL
est #define NULL 0
, car la constante entière 0
est spécifiée en C et C ++ lorsque vous la comparez à des pointeurs. Ces informations de type non typées causent des problèmes à la fois en C et en C ++. En C ++, ils ont donc décidé de créer un type et une valeur spéciaux qui font la même chose dans les cas “appropriés”, et échouent de manière fiable à la compilation ” impropres “cas d’utilisation.
Dans la mesure où votre implémentation C ++ est compatible avec l’implémentation C que vous utilisez (très rare pour que cela ne soit pas vrai), tout devrait fonctionner.
Pour être très clair, si ptr
est un type de pointeur, les expressions suivantes sont équivalentes en C ++:
ptr == nullptr ptr == NULL ptr == 0 !ptr
Comme sont les suivants:
ptr = nullptr ptr = NULL ptr = 0
et si X
est un type, les déclarations suivantes le sont aussi:
X* ptr = nullptr; X* ptr = NULL; X* ptr = 0;
nullptr
diffère lorsque vous le transmettez à une fonction de modèle qui en déduit un type ( NULL
ou 0
devient un int
sauf si il est passé à un argument qui attend un pointeur, tandis que nullptr_t
rest un nullptr_t
) char c = NULL;
) (note, pas char* c=NULL;
)