ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

NULL は使っちゃダメ

解説

ヌルポインタを表現するとき、C言語では NULL マクロを使うのが一般的です。このマクロは (void *)0 と定義されている場合が多いでしょう。そのとき、C++ では次のコードはエラーになります。

SAMPLE CODE
#define NULL (void *)0

void main()
{
    int *pi = NULL; // エラー
}

これは、void * 型から他のポインタ型への代入がタイプセーフ(型安全)ではないためです。C では許されていた代入なのですが、より安全性が確保された C++ では禁止されています。

このエラーを回避するために

#define NULL 0

と定義し直す方法が考えられますが、そうすると思わぬ弊害が起こってしまいます。次の例を見てください。

SAMPLE CODE
#include <iostream.h>

#ifdef NULL
#undef NULL
#endif
#define NULL 0

void Func( int )
{
    cout << "int" << endl;
}

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

void main()
{
    Func( NULL ); // 予期しない分岐
}


実行結果:
int

この例では、関数 Func がオーバーロードされています。main 関数からこの Func を呼び出していますが、パラメータが NULL なので、明らかに2つめの int * をパラメータとする Func が呼び出されることを意図したコードです。しかし実際はそうなりません。NULL は 0 と定義されていて、0 は整数と解釈されるのです。

このような失敗を防ぐためには、NULL マクロを使わないことです。いままでこのマクロに親しんできた人には少し辛い別れかもしれませんが、これからは NULL と書くかわりに 0 と書きましょう。

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)