hata: 'NULL' bu kapsamda bildirilmedi


119

Bu mesajı gcc 4.3 üzerinde C ++ derlerken alıyorum

error: NULL was not declared in this scope

Görünüyor ve yok oluyor ve nedenini bilmiyorum. Neden?

Teşekkürler.


2
Belki de mesajın geldiği yer kapsamında NULL ilan etmediniz?
Paul Tomblin

1
En azından hatayı veren kod parçasının tamamını göndermelisiniz. Aksi takdirde, sadece hata dizesine bakarak ne olduğunu söylemek çok zor olacaktır.
Naveen

Yanıtlar:


178

NULLbir anahtar kelime değil. Bazı standart başlıklarda tanımlanan bir tanımlayıcıdır. Dahil edebilirsiniz

#include <cstddef>

Diğer bazı temel bilgiler dahil olmak üzere kapsamda olması std::size_t.


Tanrım, Java ile o kadar şımarıkım ki (null bir anahtar kelimedir) NULL'un c ++ 'da bir anahtar kelime olmayacağını hiç düşünmemiştim. Teşekkürler :)
Stefan Hendriks

14
Aslında Java'da da bir anahtar kelime değil.
Man of One Way

4
@ManofOneWay Hayır, Java'da var, sadece büyük harf yerine tümü küçük harflerle yazılıyor.
Ataraxia

8
@ZettaSuro Var olmadığını söylemedim. Anahtar kelime olmadığını söyledim.
Man of One Way

8
Artık C ++ 11 daha genel olarak derleyiciler tarafından desteklendiğine göre, nullptrgerçek bir anahtar kelime olan ve herhangi bir #includes gerektirmeyen anahtar kelimeden bahsetmeye değer olabilir . Aynı zamanda daha fazla tip güvenlidir NULL.
templatetypedef

38

GCC, C ++ 11'e doğru adımlar atıyor, bu yüzden NULL sabitini kullanmak için şimdi cstddef eklemeniz gerekiyor . C ++ 11'de tercih edilen yol, sürüm 4.6'dan beri GCC'de uygulanan yeni nullptr anahtar sözcüğünü kullanmaktır . nullptr örtük olarak integral türlere dönüştürülemez, bu nedenle hem işaretçi hem de integral türleri için aşırı yüklenmiş bir işleve yönelik bir çağrıyı netleştirmek için kullanılabilir:

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

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

1
Ama yine de garip bir davranış! Kodumu -std = c ++ 98 GCC ile derlemek bile NULL makroyu tanımıyor ve sadece nullptr'yi c ++ 11 veya gnu ++ 11 ile -std için bağımsız değişken olarak tanıyor.
firavun

2
C ++ standardı 1998'de zaten NULL'un cstddef'de tanımlandığını belirtmiştir - yeni derleyici sürümleri standardı daha katı bir şekilde izler çünkü nullptr'yi uygulamaları gerekir. (Hatalı) kodunuz önceki GCC sürümleriyle derlendi, ancak önceki C ++ standart sürümlerine ek olarak önceki GCC sürümleriyle geriye dönük uyumlu kalmak zor olacaktır.
Seppo Enarvi

NULLhiçbir zaman yerleşik bir anahtar kelime olmadı; <stddef.h>(veya <cstddef>) dahil olmak üzere birkaç standart C başlığında tanımlanan bir makrodur . Gcc "C ++ 11'e doğru adımlar atmak" bunu nasıl etkiler? Soruda, (görünmeyen) kodun gcc / g ++ 'nın önceki sürümleriyle veya dil standardının önceki sürümleriyle derlendiğini ima eden hiçbir şey görmüyorum.
Keith Thompson

1
Yukarıda söylediğim de buydu: C ++ 98'de zaten cstddef'de tanımlanmıştı. Yine de gcc (ve diğer derleyiciler de) önce cstddef eklemeden NULL kullanan kodu kabul etti. Kesinlikle standart uyumlu olmasa da, söz konusu (görünmeyen) kodun önceki sürümlerle derlendiğinden de oldukça eminim. Şimdi, modern sürümlerin bu daha katı davranışının, derleyicinin C ++ 11 sözdizimini destekleyecek şekilde geliştirilmesinden kaynaklandığını tahmin ediyorum.
Seppo Enarvi

10

NULLbir anahtar kelime değildir; 0 için bir makro ikamedir ve gelir stddef.hveya cstddefinanıyorum. Sen sahip #includedgr ++ görmez böylece, uygun bir başlık dosyasını NULLdüzenli değişken adı olarak ve bunu ilan etmedik.


5

Diğer cevapları tamamlamak için: Eğer C ++ 11 kullanıyorsanız nullptr, null'a işaret eden bir void işaretçisi anlamına gelen bir anahtar sözcük olan kullanın. (bunun yerine, NULLbir işaretçi türü olmayan)


0

NULL şu konumlarda da bulunabilir:

#include <string.h>

String.h, NULL'u başka bir yerden çeker.


0

Makroyu NULL olarak ilan edebilirsiniz. Bunu #includes'in arkasına ekleyin:

#define NULL 0

veya

#ifndef NULL
#define NULL 0
#endif

Hayır ";" talimatların sonunda ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.