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.
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:
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.
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)
Respostas:
NULL
não é uma palavra-chave. É um identificador definido em alguns cabeçalhos padrão. Você pode incluirTê-lo no escopo, incluindo alguns outros princípios básicos, como
std::size_t
.fonte
nullptr
palavra - chave, que é uma palavra-chave real e não requer nenhum#include
s. Também é mais seguro do queNULL
.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:
fonte
NULL
nunca 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.NULL
não é uma palavra-chave; é uma substituição macro para 0 e entrastddef.h
oucstddef
, acredito. Você não possui#included
um arquivo de cabeçalho apropriado; portanto, o g ++ vêNULL
como um nome de variável regular e não o declarou.fonte
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 deNULL
, que não é um tipo de ponteiro)fonte
NULL também pode ser encontrado em:
String.h irá extrair o NULL de outro lugar.
fonte
Você pode declarar a macro NULL. Adicione isso após o seu #includes:
ou
Não ";" no final das instruções ...
fonte