__null

読み:アンダースコア・アンダースコア・ヌル
読み:アンダースコア・アンダースコア・ナル
外語:__null 英語
品詞:名詞

g++(GCC)が独自拡張で定義した予約語で、NULLポインターを表わすもの。clang/LLVMも互換性のため対応している。

目次

g++(GCC)バージョン4以上では、NULLマクロは__nullで定義される。

#if defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4
#define NULL __null
#endif

そして__null自体は、ポインター長の0となる。

32ビット環境

わざわざ独自定義する以上は、__nullはポインター長の独自の型として振る舞い、int型への代入でエラーになることが期待されるところである。しかし、そのように動くかどうかは、環境による。

32ビット環境では、現実には(int)0と同じ扱いである。

次のコードはエラーにならない。

int i = __null;

そして、typeid(__null).name()で__nullの型を調べると、「int」と出力される。32ビット環境では、__nullはint型なのである。

64ビット環境

__nullが存在するのは、64ビット環境への対応のためである。64ビット環境では、NULLと0は同一とは限らない。

#include <iostream>
int main()
{
  std::cout << "sizeof(NULL) : " << sizeof(NULL) << std::endl;
  std::cout << "sizeof(0) : " << sizeof(0) << std::endl;
  std::cout << "sizeof(0L) : " << sizeof(0L) << std::endl;
  return 0;
}

64ビット環境では次のようになる。

sizeof(NULL) : 8
sizeof(0) : 4
sizeof(0L) : 8

これはLP64と呼ばれるデータ型モデルだからであり、longとポインターが64ビットで、intと長さが違うのが特徴である。LinuxFreeBSDPC UNIXはじめUNIX系システムの標準となっている。

そして、typeid(__null).name()で__nullの型を調べると、「long」と出力される。64ビット環境では、__nullはlong型なのである。

ここから分かる結論は、次の通りである。

  • g++(GCC)の場合、NULLは0に展開されるわけではなく、__nullに展開される
  • 0とNULLは長さが違う

C++だからといっても、常に「#define NULL 0」な訳ではない。

また、64ビット環境でintに対して__nullを代入しようとすると、警告やエラーが出る。

関連する用語
C
C++
nullptr

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club