web-dev-qa-db-ja.com

C NULLはC ++ 11 nullptrと等しい

NULLの代わりにnullptrを使用するのが好きです。次に、C関数を呼び出します(この場合はlibjanssonから)。

CのNULLは実装 定義済み です。

nullptrの場合、「ヌルポインター定数は整数定数式(5.19)ゼロと評価される整数型の右辺値」であることがわかりました。

だから最も安全なこと:

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;

本当に必要ですか、それとももっと簡単にできますか?

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;
16
user877329

C++ 11以降では、==NULLであるポインターも==nullptrになり、その逆も同様です。

ポインターとの比較以外のNULLの使用(文字列の末尾のヌルバイトを表すために使用するなど)は、nullptrでは機能しません。

場合によっては、NULL#define NULL 0であるため、整数定数0は、ポインターと比較したときにCおよびC++で特殊なケースになっています。この型以外の型情報は、CとC++の両方でいくつかの問題を引き起こすため、C++では、「適切な」ユースケースで同じことを行う特別な型と値を作成し、ほとんどの「不適切な」ユースケース。

C++実装が、相互運用しているC実装と互換性がある限り(これが当てはまらないことは非常にまれです)、すべてが機能するはずです。


明確にするために、ptrが任意の種類のポインターである場合、次の式はC++で同等です。

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

次のとおりです。

ptr = nullptr
ptr = NULL
ptr = 0

Xが何らかのタイプである場合、次のステートメントも同様です。

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

nullptrは、型を推測するテンプレート関数に渡すと異なります(NULLまたは0は、ポインターを期待する引数に渡さない限りintになりますが、nullptrnullptr_t)のままです。 nullptrはコンパイルされません(char c = NULL;など)(char* c=NULL;ではなく)

最後に、文字通り:

NULL == nullptr

本当です。

NULL定数はポインター型に昇格され、ポインターとしてNULLポインターになり、nullptrと等しくなります。