错误:未在此范围内声明“ NULL”


119

我在gcc 4.3上编译C ++时收到此消息

error: NULL was not declared in this scope

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

谢谢。


2
也许您还没有在消息来源的范围内声明NULL?
Paul Tomblin,2009年

1
您应该至少发布给出错误的完整代码。否则,仅通过查看错误字符串就很难判断发生了什么。
Naveen

Answers:


178

NULL不是关键字。这是一些标准标头中定义的标识符。您可以包括

#include <cstddef>

使其具有范围,包括一些其他基础知识,例如std::size_t


天哪,我对Java(空为关键字)非常着迷,以至于我从没想到NULL不会成为c ++中的关键字。谢谢:)
Stefan Hendriks

14
实际上,它也不是Java中的关键字。
一种方式的人

4
@ManofOneWay不,它存在于Java中,只是用小写而不是大写拼写。
Ataraxia

8
@ZettaSuro我不是说它不存在。我只是说这不是关键字。
一种方式的人

8
既然C ++ 11更受编译器支持,那么可能值得一提的是nullptr关键字,它是一个实际的关键字,不需要任何#includes。它也比更具类型安全性NULL
templatetypedef

38

GCC正在朝C ++ 11迈进,这也许就是为什么您现在需要包括cstddef才能使用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.

1
但是仍然是一个奇怪的行为!即使使用-std = c ++ 98编译我的代码,GCC剧照也无法识别NULL宏,它只能识别使用c ++ 11或gnu ++ 11作为-std参数的nullptr。
法老王2012年

2
C ++标准已经在1998年声明cstddef中定义了NULL-新的编译器版本只是更严格地遵循该标准,因为它们需要实现nullptr。您的(错误的)代码已经使用较早的GCC版本进行了编译,但是,除了较早的C ++标准版本之外,要保持与较早的GCC版本的向后兼容性是很困难的。
Seppo Enarvi 2012年

NULL从来都不是内置关键字;它是在几个标准C标头中定义的宏,包括<stddef.h>(或<cstddef>)。gcc“迈向C ++ 11的步骤”如何影响这一点?我在这个问题中没有发现任何暗示用旧版本的gcc / g ++或语言版本的早期版本编译的(看不见的)代码。
基思·汤普森

1
这就是我上面所说的:在C ++ 98中,它已在cstddef中定义。仍然gcc(以及其他编译器)接受了使用NULL的代码,而没有首先包含cstddef。我很确定也可以用较早的版本编译所讨论的(看不见的)代码,即使它不是严格符合标准的。现在,我只是猜测现代版本的这种更严格的行为是由于开发了支持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。在#includes之后添加:

#define NULL 0

要么

#ifndef NULL
#define NULL 0
#endif

不“;” 在说明的末尾...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.