1. ホーム
  2. c

[解決済み] CのNULLはC++11のnullptrと同じか?

2022-03-01 20:44:40

質問

を使うのが好きです。 nullptr NULLの代わりに ここでCの関数を呼び出すと ( libjansson この場合は)

NULL をC言語で実装したものです。 定義済み .

について nullptr NULLポインタ定数は、ゼロに評価される整数型の積分定数式(5.19)rvalueである"ということがわかりました。

だから、一番安全なのは

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;

解決方法は?

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 は、ポインタを期待する引数に渡されない限りは nullptr のままです。 nullptr_t ) で使用される場合、いくつかのコンテキストでは nullptr はコンパイルされません (たとえば char c = NULL; ) (注 char* c=NULL; )

最後に、文字通りの意味です。

NULL == nullptr

が真であることを示します。

は、その NULL 定数はポインタ型に昇格し、ポインタとしてはヌルポインタとなり、等しく比較されます。 nullptr .


にもかかわらず、必ずしもそうとは限りません。

 foo(NULL)

そして

 foo(nullptr)

を実行します。

void bar(int) { std::cout << "int\n"; }
void bar(void*) { std::cout << "void*\n"; }
template<class T>
void foo(T t) { bar(t); }
foo(NULL);
foo(nullptr);

この印刷物 int に対して NULLvoid* に対して nullptr .