none
「0」、「NULL」について RRS feed

  • 質問

  • OS WindowsXP

    開発環境 VC++2008

    で開発しておりますが、C++でのNULLの扱いについて悩んでいます。

    今まではNULLを使用していたのですが、

    色々サイトを見てみると

    C++ではNULLではなく0を使用した方がいい。

    というサイトや書き込みを良く見かけます。

     

    個人的には NULL を使いたいのですが、

    0を使用した方がいいのでしょうか?

     

    2011年5月13日 5:24

回答

  • 人間がヌルポインタであることがわかりやすいようにする目的でNULLを使用する。ただし内部的には0であり時には数値として解釈されてしまうことを忘れてはいけない。

    昔、Effective C++ を読んで「なるほどな」と思った例を蛇足で。

    void f(int) {
    	cout << "f(int) called" << endl;
    }
    void f(void*) {
    	cout << "f(void*) called" << endl;
    }
    

    こんな感じの2つの関数があると f(NULL) は int の方が呼ばれます。時には数値として解釈されてしまうという好例かと。

    近い将来、何も考えずに「そういう時は nullptr を使え」で済むようになるんでしょうね。NULL の代わりに 0 を使っていると後から全部 nullptr に置換したくなった時に大変だと思うので、nullptr が使えない環境では 0 を使うよりも気をつけながら NULL を使う方がベターな気がします。(少なくとも私はそう思って NULL を使うようにしています。)

    • 回答としてマーク Kiirokuma 2011年5月20日 1:00
    2011年5月17日 2:21

すべての返信

  • 書かれていませんがヌルポインタとして 0 / NULL どちらが適切かという質問でしょうか? 数値のzeroとしては 0 を使用すべきです。

    0 / NULL の議論はいろいろ難しいものがありますが、

    人間がヌルポインタであることがわかりやすいようにする目的でNULLを使用する。ただし内部的には0であり時には数値として解釈されてしまうことを忘れてはいけない。

    と考えています。そして近頃、新たな展開があります。VC++ 2010からnullptrキーワードが用意されました。(正確にはVC++ 2008にもC++/CLI向けには存在します。)
    nullptrキーワードが使える環境ではこれを使うのが一番いいです。 

    2011年5月13日 6:30
  • >C++ではNULLではなく0を使用した方がいい
    様々な理由があるとは思いますが、ご自身で「これは理に適っているから、0を使用した方が良いのではないか」と思った理由は何でしょうか。

    Softwareの開発分野で使い分ければよいとは思いますが、
    Windows Applicationの開発では、Windows APIのReferenceにNULL表記が使われているので、私はそれに合わせてNULLを使っています。

    以前似たような質問があったので紹介しておきますね。
    [nullptrとNULL]
      http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/3171a074-5ae2-4bbe-88a0-fdef3f972536/

    2011年5月13日 10:47
  • 人間がヌルポインタであることがわかりやすいようにする目的でNULLを使用する。ただし内部的には0であり時には数値として解釈されてしまうことを忘れてはいけない。

    昔、Effective C++ を読んで「なるほどな」と思った例を蛇足で。

    void f(int) {
    	cout << "f(int) called" << endl;
    }
    void f(void*) {
    	cout << "f(void*) called" << endl;
    }
    

    こんな感じの2つの関数があると f(NULL) は int の方が呼ばれます。時には数値として解釈されてしまうという好例かと。

    近い将来、何も考えずに「そういう時は nullptr を使え」で済むようになるんでしょうね。NULL の代わりに 0 を使っていると後から全部 nullptr に置換したくなった時に大変だと思うので、nullptr が使えない環境では 0 を使うよりも気をつけながら NULL を使う方がベターな気がします。(少なくとも私はそう思って NULL を使うようにしています。)

    • 回答としてマーク Kiirokuma 2011年5月20日 1:00
    2011年5月17日 2:21
  • Visual C++では次のようにNULLが定義されています。

    /* Define NULL pointer value */
    #ifndef NULL
    #ifdef __cplusplus
    #define NULL    0
    #else
    #define NULL    ((void *)0)
    #endif
    #endif

    これの意味するところはまさしくzakioさんが挙げられたように、C++におけるオーバーロード解決ではintが選ばれる必要があるからで、Cの時とC++の時とで定義内容を区別しているわけです。

    ちなみにプログラミング言語C++ 第3版には

    const int NULL = 0;

    とありました。

    2011年5月17日 2:46
  • みなさま

    お返事ありがとうございます。

    もうしわけありません、ヌルポインタの話である説明が抜けていました。

    皆様の書き込みを読ませていただいた結果、やはり私的には0を使うメリットがあまり感じられないので、

    今後nullptrに移行させることを考えれば、NULLを使っていたほうが良いかなと思いました。

     

     

     

     

    2011年5月20日 1:00