132

I get this message when compiling C++ on gcc 4.3

error: ‘NULL’ was not declared in this scope

It appears and disappears and I don't know why. Why?

Thanks.

jackhab
  • 17,128
  • 37
  • 99
  • 136
  • 2
    Perhaps you haven't declared NULL in the scope of where the message is coming from? – Paul Tomblin Jan 20 '09 at 17:08
  • 1
    You should atleast post the complete piece of code which is giving the error. Otherwise it will be very difficult to tell what is happening by just looking at the error string. – Naveen Jan 20 '09 at 17:11

8 Answers8

190

NULL is not a keyword. It's an identifier defined in some standard headers. You can include

#include <cstddef>

To have it in scope, including some other basics, like std::size_t.

Johannes Schaub - litb
  • 496,577
  • 130
  • 894
  • 1,212
39

GCC is taking steps towards C++11, which is probably why you now need to include cstddef in order to use the NULL constant. The preferred way in C++11 is to use the new nullptr keyword, which is implemented in GCC since version 4.6. nullptr is not implicitly convertible to integral types, so it can be used to disambiguate a call to a function which has been overloaded for both pointer and integral types:

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

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
Seppo Enarvi
  • 3,219
  • 3
  • 32
  • 25
  • 1
    But still It is a strange behavior! Even compiling my code with -std=c++98 GCC stills don't recognize NULL macro, and It only recognize nullptr with either c++11 or gnu++11 as argument for -std. – pharaoh Nov 17 '12 at 17:41
  • 2
    The C++ standard has stated already in 1998 that NULL is defined in cstddef - the new compiler versions just follow the standard more strictly because they need to implement nullptr. Your (faulty) code has compiled with earlier GCC versions, but it would be difficult to stay backward compatible with earlier GCC versions, in addition to earlier C++ standard versions. – Seppo Enarvi Nov 18 '12 at 19:47
  • 1
    `NULL` has never been a built-in keyword; it's a macro defined in several standard C headers, including `` (or ``). How does gcc "taking steps towards C++11" affect this? I see nothing in the question that implies that the (unseen) code compiled with earlier versions of gcc/g++, or with earlier versions of the language standard. – Keith Thompson Sep 23 '13 at 17:58
  • 1
    That's just what I said above: Already in C++98 it was defined in cstddef. Still gcc (and other compilers too) accepted code that used NULL without including cstddef first. I'm quite sure also the (unseen) code in question compiled with earlier versions, even though it's not strictly standard compliant. Now I'm only guessing that this stricter behavior of modern versions is due to development of the compiler to support the C++11 syntax. – Seppo Enarvi Sep 24 '13 at 19:18
10

NULL isn't a keyword; it's a macro substitution for 0, and comes in stddef.h or cstddef, I believe. You haven't #included an appropriate header file, so g++ sees NULL as a regular variable name, and you haven't declared it.

taskinoor
  • 45,586
  • 12
  • 116
  • 142
David Thornley
  • 56,304
  • 9
  • 91
  • 158
6

To complete the other answers: If you are using C++11, use nullptr, which is a keyword that means a void pointer pointing to null. (instead of NULL, which is not a pointer type)

Leonardo Raele
  • 2,400
  • 2
  • 28
  • 32
2

NULL is not a keyword. It's an identifier defined in some standard headers. You can include

#include <iostream>
1

NULL can also be found in:

#include <string.h>

String.h will pull in the NULL from somewhere else.

Owl
  • 1,446
  • 14
  • 20
0

You can declare the macro NULL. Add that after your #includes:

#define NULL 0

or

#ifndef NULL
#define NULL 0
#endif

No ";" at the end of the instructions...

Owl
  • 1,446
  • 14
  • 20
Derzu
  • 7,011
  • 3
  • 57
  • 60
0

If you look carefully into NULL macro in any std header:

#define NULL __null

So basically, you may use the __null keyword instead.