| ア | イ | ウ | エ | オ |
| カ | キ | ク | ケ | コ |
| サ | シ | ス | セ | ソ |
| タ | チ | ツ | テ | ト |
| ナ | ニ | ヌ | ネ | ノ |
| ハ | ヒ | フ | ヘ | ホ |
| マ | ミ | ム | メ | モ |
| ヤ | ユ | ヨ | ||
| ラ | リ | ル | レ | ロ |
| ワ | ヰ | ヴ | ヱ | ヲ |
| ン |
| A | B | C | D | E |
| F | G | H | I | J |
| K | L | M | N | O |
| P | Q | R | S | T |
| U | V | W | X | Y |
| Z | 数字 | 記号 | ||
g++(GCC)が独自拡張で定義した予約語で、NULLポインターを表わすもの。clang/LLVMも互換性のため対応している。
g++(GCC)バージョン4以上では、NULLマクロは__nullで定義される。
#if defined(__GNUG__) && defined(__GNUC__) && __GNUC__ >= 4 #define NULL __null #endif
そして__null自体は、ポインター長の0となる。
わざわざ独自定義する以上は、__nullはポインター長の独自の型として振る舞い、int型への代入でエラーになることが期待されるところである。しかし、そのように動くかどうかは、環境による。
32ビット環境では、現実には(int)0と同じ扱いである。
次のコードはエラーにならない。
int i = __null;
そして、typeid(__null).name()で__nullの型を調べると、「int」と出力される。32ビット環境では、__nullはint型なのである。
__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と長さが違うのが特徴である。LinuxやFreeBSD等PC UNIXはじめUNIX系システムの標準となっている。
そして、typeid(__null).name()で__nullの型を調べると、「long」と出力される。64ビット環境では、__nullはlong型なのである。
ここから分かる結論は、次の通りである。
C++だからといっても、常に「#define NULL 0」な訳ではない。
また、64ビット環境でintに対して__nullを代入しようとすると、警告やエラーが出る。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます