エラー: 'NULL'はこのスコープで宣言されていません


119

gcc 4.3でC ++をコンパイルすると、このメッセージが表示されます

error: NULL was not declared in this scope

それが現れたり消えたりし、なぜなのか分かりません。どうして?

ありがとう。


2
おそらく、メッセージの送信元のスコープでNULLを宣言していませんか?
ポールトンブリン

1
エラーの原因となっているコード全体を少なくとも投稿する必要があります。そうしないと、エラー文字列を見ただけでは何が起こっているのかを知るのが非常に難しくなります。
Naveen、

回答:


178

NULLはキーワードではありません。これは、一部の標準ヘッダーで定義されている識別子です。含めることができます

#include <cstddef>

のような他のいくつかの基本を含め、それを範囲内に含めることstd::size_t


神様、私はJava(nullはキーワード)に甘やかされているので、c ++ではNULLがキーワードにならないとは思いもしませんでした。ありがとう:)
Stefan Hendriks、2011年

14
実際には、Javaのキーワードでもありません。
片道の男

4
@ManofOneWayいいえ、それはJavaに存在し、大文字ではなくすべて小文字で綴られているだけです。
Ataraxia 2013年

8
@ZettaSuro存在しないとは言わなかった。私はそれがキーワードではないと言いました。
Man of One Way

8
C ++ 11がより一般的にコンパイラーでサポートされるようになったのでnullptr、実際のキーワードであり、#includesを必要としないキーワードについて言及する価値があるかもしれません。また、よりタイプセーフですNULL
templatetypedef

38

GCCはC ++ 11に向けて一歩を踏み出しています。これがおそらく、NULL定数を使用するためにcstddefを含める必要がある理由です。C ++ 11で推奨される方法は、バージョン4.6以降にGCCに実装されている新しいnullptrキーワードを使用することです。nullptrは暗黙的に整数型に変換できないため、ポインター型と整数型の両方でオーバーロードされている関数の呼び出しを明確にするために使用できます。

void f(int x);
void f(void * ptr);

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.

1
しかしそれでも奇妙な行動です!-std = c ++ 98を使用してコードをコンパイルしても、GCCは引き続きNULLマクロを認識せず、-stdの引数としてc ++ 11またはgnu ++ 11のいずれかでnullptrのみを認識します。
ファラオ

2
C ++標準は、1998年にNULLがcstddefで定義されているとすでに述べています。新しいコンパイラバージョンは、nullptrを実装する必要があるため、標準に厳密に従うだけです。(障害のある)コードは以前のGCCバージョンでコンパイルされていますが、以前のC ++標準バージョンに加えて、以前のGCCバージョンとの下位互換性を維持することは困難です。
Seppo Enarvi

NULL組み込みのキーワードではありません。これは<stddef.h>(または<cstddef>)を含むいくつかの標準Cヘッダーで定義されたマクロです。gccが「C ++ 11に向けて一歩を踏み出した」ことはこれにどのような影響を与えますか (目に見えない)コードが以前のバージョンのgcc / g ++または以前のバージョンの言語標準でコンパイルされたことを意味する質問には何も見当たりません。
キース・トンプソン

1
それはちょうど私が上で言ったことです:すでにC ++ 98でそれはcstddefで定義されました。それでもgcc(および他のコンパイラも)は、最初にcstddefを含めずにNULLを使用するコードを受け入れました。厳密には標準に準拠していませんが、問題の(目に見えない)コードも以前のバージョンでコンパイルされていると確信しています。今、私は、最新バージョンのこのより厳しい動作がC ++ 11構文をサポートするコンパイラの開発によるものであると推測しているだけです。
Seppo Enarvi 2013

10

NULLはキーワードではありません。これは0のマクロ置換であり、stddef.hまたはcstddefに入ると思います。#included適切なヘッダーファイルがないため、g ++はNULL通常の変数名として認識され、宣言されていません。


5

他の回答を完了するには:C ++ 11を使用しているnullptr場合は、nullを指すvoidポインターを意味するキーワードであるを使用します。(代わりにNULL、ポインタ型ではありません)


0

NULLは次の場所にもあります。

#include <string.h>

String.hは、どこかからNULLをプルします。


0

マクロNULLを宣言できます。#includeの後に追加します。

#define NULL 0

または

#ifndef NULL
#define NULL 0
#endif

番号 ";" 手順の最後に...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.