erro: 'NULL' não foi declarado neste escopo

119

Recebo esta mensagem ao compilar C ++ no gcc 4.3

error: NULL was not declared in this scope

Aparece e desaparece e não sei por quê. Por quê?

Obrigado.

jackhab
fonte
2
Talvez você não tenha declarado NULL no escopo de onde a mensagem vem.
Paul Tomblin
1
Você deve publicar pelo menos todo o código que está dando o erro. Caso contrário, será muito difícil dizer o que está acontecendo apenas olhando para a sequência de erros.
Naveen

Respostas:

178

NULLnão é uma palavra-chave. É um identificador definido em alguns cabeçalhos padrão. Você pode incluir

#include <cstddef>

Tê-lo no escopo, incluindo alguns outros princípios básicos, como std::size_t.

Johannes Schaub - litb
fonte
Deus, estou tão mimado com Java (nulo sendo uma palavra-chave) que nunca pensei que NULL não seria uma palavra-chave em c ++. Obrigado :)
Stefan Hendriks
14
Na verdade, também não é uma palavra-chave em Java.
1:
4
@ManofOneWay Não, ele existe em Java, apenas está escrito com todas as letras minúsculas em vez de maiúsculas.
Ataraxia
8
@ZettaSuro Eu não disse que não existe. Eu apenas disse que não é uma palavra-chave.
Homem de Uma Via
8
Agora que o C ++ 11 é geralmente suportado por compiladores, vale a pena mencionar a nullptrpalavra - chave, que é uma palavra-chave real e não requer nenhum #includes. Também é mais seguro do que NULL.
templatetypedef
38

O GCC está tomando medidas em direção ao C ++ 11, provavelmente o motivo pelo qual agora você precisa incluir o cstddef para usar a constante NULL . A maneira preferida no C ++ 11 é usar a nova palavra-chave nullptr , que é implementada no GCC desde a versão 4.6. nullptr não é implicitamente convertível em tipos integrais, portanto, pode ser usado para desambiguar uma chamada para uma função que foi sobrecarregada para os tipos ponteiro e integral:

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

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
Seppo Enarvi
fonte
1
Mas ainda é um comportamento estranho! Mesmo compilando meu código com -std = c ++ 98 as imagens estáticas do GCC não reconhecem a macro NULL e ele reconhece o nullptr apenas com o c ++ 11 ou o gnu ++ 11 como argumento para -std.
Faraó
2
O padrão C ++ já declarou em 1998 que NULL é definido no cstddef - as novas versões do compilador apenas seguem o padrão mais estritamente porque precisam implementar o nullptr. Seu código (defeituoso) foi compilado com versões anteriores do GCC, mas seria difícil manter a compatibilidade com versões anteriores do GCC, além das versões padrão anteriores do C ++.
Seppo Enarvi 18/11/2012
NULLnunca foi uma palavra-chave incorporada; é uma macro definida em vários cabeçalhos C padrão, incluindo <stddef.h>(ou <cstddef>). Como o gcc "dar passos em direção ao C ++ 11" afeta isso? Não vejo nada na pergunta que implique que o código (invisível) seja compilado com versões anteriores do gcc / g ++ ou com versões anteriores do padrão da linguagem.
21713 Keith Thompson
1
Foi exatamente o que eu disse acima: já no C ++ 98 ele foi definido no cstddef. Ainda o gcc (e outros compiladores também) aceitaram código que usava NULL sem incluir o cstddef primeiro. Tenho certeza de que também o código (invisível) em questão compilado com versões anteriores, mesmo que não seja estritamente compatível com o padrão. Agora, estou apenas supondo que esse comportamento mais rigoroso das versões modernas se deva ao desenvolvimento do compilador para suportar a sintaxe do C ++ 11.
Seppo Enarvi 24/09
10

NULLnão é uma palavra-chave; é uma substituição macro para 0 e entra stddef.hou cstddef, acredito. Você não possui #includedum arquivo de cabeçalho apropriado; portanto, o g ++ vê NULLcomo um nome de variável regular e não o declarou.

David Thornley
fonte
5

Para concluir as outras respostas: Se você estiver usando o C ++ 11, use nullptr, que é uma palavra-chave que significa um ponteiro nulo apontando para nulo. (em vez de NULL, que não é um tipo de ponteiro)

Leonardo Raele
fonte
0

NULL também pode ser encontrado em:

#include <string.h>

String.h irá extrair o NULL de outro lugar.

Coruja
fonte
0

Você pode declarar a macro NULL. Adicione isso após o seu #includes:

#define NULL 0

ou

#ifndef NULL
#define NULL 0
#endif

Não ";" no final das instruções ...

Derzu
fonte