错误:‘;空’;未在此范围中声明 P>在GCC 4.3 编译C++时得到此消息 error: ‘NULL’ was not declared in this scope

错误:‘;空’;未在此范围中声明 P>在GCC 4.3 编译C++时得到此消息 error: ‘NULL’ was not declared in this scope,c++,gcc,pointers,null,C++,Gcc,Pointers,Null,它出现和消失,我不知道为什么。为什么? 谢谢。NULL不是关键字;它是0的一个宏替换,我相信是stddef.h或cstddef。您没有包含适当的头文件,因此g++将NULL视为常规变量名,您没有声明它。NULL不是关键字。它是一些标准标题中定义的标识符。你可以包括 #include <cstddef> #包括 为了让它在范围内,包括一些其他的基础知识,比如std::size\tGCC正在朝着C++11的方向发展,这可能就是为什么现在需要包含cstdef以使用NULL常量的原因。在

它出现和消失,我不知道为什么。为什么?


谢谢。

NULL
不是关键字;它是0的一个宏替换,我相信是
stddef.h
cstddef
。您没有包含适当的头文件,因此g++将
NULL
视为常规变量名,您没有声明它。

NULL
不是关键字。它是一些标准标题中定义的标识符。你可以包括

#include <cstddef>
#包括

为了让它在范围内,包括一些其他的基础知识,比如
std::size\t
GCC正在朝着C++11的方向发展,这可能就是为什么现在需要包含cstdef以使用NULL常量的原因。在C++11中,首选的方法是使用新的nullptr关键字,它从4.6版开始在GCC中实现。nullptr不能隐式转换为整数类型,因此可以使用它消除对函数的调用的歧义,该函数对于指针类型和整数类型都已重载:

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

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

要完成其他答案:如果您使用的是C++11,请使用
nullptr
,这是一个表示指向null的空指针的关键字。(而不是
NULL
,它不是指针类型)

您可以声明宏NULL。在您的#包括之后添加:

#define NULL 0


说明末尾的“否”;“空”也可以在以下位置找到:

#include <string.h>
#包括

String.h将从其他地方引入NULL。

如果仔细查看任何std头中的NULL宏:

#定义空值


因此,基本上,您可以使用
\uu null
关键字来代替。

也许您没有在消息来源的范围内声明null?您应该至少发布给出错误的完整代码段。否则,很难通过看错误字符串来判断发生了什么。上帝,我被java(NULL是关键字)宠坏了,我从来没有想过NULL不是C++中的关键字。谢谢:)实际上它在Java中也不是一个关键字。@Manofonway不,它在Java中存在,它只是用小写字母而不是大写字母拼写。@ZettaSuro我没说它不存在。我只是说它不是一个关键字。现在编译器更普遍地支持C++11,可能值得一提的是
nullptr
关键字,它是一个实际的关键字,不需要任何
\include
s。它的类型安全性也比
NULL
更高。但它仍然是一种奇怪的行为!即使用-STD= C++ 98 GCC静态代码编译我的代码,也不能识别NULL宏,它只识别n+LtpR,其中C++ 11或GnU+++ 11作为ST-D的参数。C++标准已经在1998中声明了CSTDDF中定义了NULL。新的编译器版本更严格地遵循标准,因为它们需要实现NulLPTR。您(错误的)代码已经编译成早期的GCC版本,但是除了较早的C++标准版本之外,很难与后一个GCC版本保持向后兼容。它是在几个标准C标题中定义的宏,包括
(或
)。gcc“迈向C++11的步骤”是如何影响这一点的?在这个问题中,我看不到任何暗示(看不见的)代码是用早期版本的gcc/g++编译的,或者是用早期版本的语言标准编译的。gcc(以及其他编译器)仍然接受使用NULL而不首先包含cstddef的代码。我很确定(看不见的)有问题的代码是用早期版本编译的,尽管它不是严格符合标准的。现在我只能猜测,现代版本的这种更严格的行为是由于开发了支持C++11语法的编译器。
#include <string.h>