error: 'NULL' tidak dideklarasikan dalam lingkup ini

119

Saya mendapatkan pesan ini saat mengkompilasi C ++ di gcc 4.3

error: NULL was not declared in this scope

Muncul dan menghilang dan saya tidak tahu mengapa. Mengapa?

Terima kasih.

jackhab
sumber
2
Mungkin Anda belum mendeklarasikan NULL dalam lingkup dari mana pesan itu berasal?
Paul Tomblin
1
Anda setidaknya harus memposting kode lengkap yang memberikan kesalahan. Jika tidak, akan sangat sulit untuk mengetahui apa yang terjadi hanya dengan melihat string kesalahan.
Naveen

Jawaban:

178

NULLbukan kata kunci. Ini adalah pengenal yang ditentukan dalam beberapa header standar. Anda bisa memasukkan

#include <cstddef>

Untuk memilikinya dalam ruang lingkup, termasuk beberapa dasar lainnya, seperti std::size_t.

Johannes Schaub - litb
sumber
Ya Tuhan, saya sangat dimanjakan dengan Java (null menjadi kata kunci) sehingga saya tidak pernah berpikir bahwa NULL tidak akan menjadi kata kunci di c ++. Terima kasih :)
Stefan Hendriks
14
Sebenarnya itu juga bukan kata kunci di Jawa.
Man of One Way
4
@ManofOneWay Tidak, ini ada di Java, hanya dieja dengan semua huruf kecil, bukan huruf kapital.
Ataraxia
8
@ZettaSuro Saya tidak mengatakan itu tidak ada. Saya hanya mengatakan itu bukan kata kunci.
Man of One Way
8
Sekarang C ++ 11 lebih umumnya didukung oleh kompiler, mungkin ada baiknya menyebutkan nullptrkata kunci, yang merupakan kata kunci sebenarnya dan tidak memerlukan #includes. Ini juga lebih aman daripada NULL.
templatetypedef
38

GCC mengambil langkah menuju C ++ 11, yang mungkin menjadi alasan mengapa Anda sekarang perlu menyertakan cstddef untuk menggunakan konstanta NULL . Cara yang disukai di C ++ 11 adalah dengan menggunakan kata kunci nullptr baru , yang diterapkan di GCC sejak versi 4.6. nullptr tidak secara implisit dapat diubah menjadi tipe integral, sehingga dapat digunakan untuk membedakan panggilan ke fungsi yang telah kelebihan beban untuk tipe pointer dan integral:

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

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.
Seppo Enarvi
sumber
1
Tapi tetap saja itu adalah perilaku yang aneh! Bahkan mengkompilasi kode saya dengan -std = c ++ 98 GCC masih tidak mengenali makro NULL, dan itu hanya mengenali nullptr dengan c ++ 11 atau gnu ++ 11 sebagai argumen untuk -std.
firaun
2
Standar C ++ telah menyatakan pada tahun 1998 bahwa NULL didefinisikan di cstddef - versi kompiler baru hanya mengikuti standar lebih ketat karena mereka perlu mengimplementasikan nullptr. Kode (salah) Anda telah dikompilasi dengan versi GCC sebelumnya, tetapi akan sulit untuk tetap kompatibel dengan versi GCC sebelumnya, selain versi standar C ++ sebelumnya.
Seppo Enarvi
NULLtidak pernah menjadi kata kunci bawaan; itu adalah makro yang ditentukan dalam beberapa header C standar, termasuk <stddef.h>(atau <cstddef>). Bagaimana pengaruh gcc "mengambil langkah menuju C ++ 11"? Saya tidak melihat apa pun dalam pertanyaan yang menyiratkan bahwa kode (tak terlihat) dikompilasi dengan versi gcc / g ++ sebelumnya, atau dengan versi standar bahasa sebelumnya.
Keith Thompson
1
Itulah yang saya katakan di atas: Sudah di C ++ 98 itu didefinisikan di cstddef. Masih gcc (dan kompiler lain juga) menerima kode yang menggunakan NULL tanpa menyertakan cstddef terlebih dahulu. Saya cukup yakin juga kode (tak terlihat) yang dipermasalahkan dikompilasi dengan versi sebelumnya, meskipun tidak sepenuhnya memenuhi standar. Sekarang saya hanya menebak bahwa perilaku yang lebih ketat dari versi modern ini disebabkan oleh pengembangan compiler untuk mendukung sintaks C ++ 11.
Seppo Enarvi
10

NULLbukan kata kunci; itu substitusi makro untuk 0, dan masuk stddef.hatau cstddef, saya yakin. Anda tidak #includedmemiliki file header yang sesuai, jadi g ++ melihatnya NULLsebagai nama variabel biasa, dan Anda belum mendeklarasikannya.

David Thornley
sumber
5

Untuk melengkapi jawaban lainnya: Jika Anda menggunakan C ++ 11, gunakan nullptr, yaitu kata kunci yang berarti penunjuk kosong yang mengarah ke null. (bukan NULL, yang bukan tipe penunjuk)

Leonardo Raele
sumber
0

NULL juga dapat ditemukan di:

#include <string.h>

String.h akan menarik NULL dari tempat lain.

Burung hantu
sumber
0

Anda dapat mendeklarasikan makro NULL. Tambahkan itu setelah #includes Anda:

#define NULL 0

atau

#ifndef NULL
#define NULL 0
#endif

Tidak ";" di akhir instruksi ...

Derzu
sumber