112

Tôi nhận được thông báo này khi biên dịch C ++ trên gcc 4.3

error: NULL was not declared in this scope

Nó xuất hiện và biến mất và tôi không biết tại sao. Tại sao?

Cảm ơn.

|
170

NULLkhông phải là một từ khóa. Đó là một định danh được xác định trong một số tiêu đề. Bạn có thể bao gồm

#include <cstddef>

Để có nó trong phạm vi, bao gồm một số điều cơ bản khác, như std::size_t.

|
  • 1

    Chúa ơi, tôi rất thích Java (null là một từ khóa) đến nỗi tôi không bao giờ nghĩ rằng NULL sẽ không phải là một từ khóa trong c ++. Cảm ơn :)

    – Hồ Nghi Minh 19:45:28 04/10/2011
  • 1

    Thật ra nó cũng không phải là một từ khóa trong Java.

    – Hồ Diên Vỹ 22:11:41 19/06/2012
  • 1

    @ManofOneWay Không, nó tồn tại trong Java, nó chỉ được đánh vần bằng tất cả chữ thường thay vì chữ hoa.

    – Đỗ Nghị Lực 04:08:35 17/03/2013
  • 1

    @ZettaSuro Tôi không nói nó không tồn tại. Tôi chỉ nói rằng nó không phải là một từ khóa.

    – Dương Ðức Thọ 19:44:31 19/03/2013
  • 1

    Bây giờ C ++ 11 thường được các trình biên dịch hỗ trợ nhiều hơn, có lẽ nên đề cập đến nullptrtừ khóa, đây là một từ khóa thực tế và không yêu cầu bất kỳ #includes. Nó cũng an toàn hơn NULL.

    – Hồ Uy Vũ 01:10:33 10/03/2015
36

GCC đang thực hiện các bước đối với C ++ 11, đó có lẽ là lý do tại sao bây giờ bạn cần đưa cstddef để sử dụng hằng số NULL . Cách ưa thích trong C ++ 11 là sử dụng từ khóa nullptr mới , được triển khai trong GCC kể từ phiên bản 4.6. nullptr không hoàn toàn có thể chuyển đổi thành các loại tích phân, vì vậy nó có thể được sử dụng để phân tán một cuộc gọi đến một hàm đã bị quá tải cho cả hai loại con trỏ và tích phân:

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

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

    Nhưng vẫn là một hành vi kỳ lạ! Ngay cả khi biên dịch mã của tôi với -std = c ++ 98 GCC vẫn không nhận ra macro NULL và Nó chỉ nhận ra nullptr với c ++ 11 hoặc gnu ++ 11 làm đối số cho -std.

    – Hoàng Ái Khanh 17:41:49 17/11/2012
  • 1

    Tiêu chuẩn C ++ đã tuyên bố vào năm 1998 rằng NULL được định nghĩa trong cstddef - các phiên bản trình biên dịch mới chỉ tuân theo tiêu chuẩn nghiêm ngặt hơn vì chúng cần phải thực hiện nullptr. Mã (bị lỗi) của bạn đã được biên dịch với các phiên bản GCC trước đó, nhưng sẽ khó có thể tương thích ngược với các phiên bản GCC trước đó, ngoài các phiên bản tiêu chuẩn C ++ trước đó.

    – Đặng Duy Quang 19:47:23 18/11/2012
  • 1

    NULLchưa bao giờ là một từ khóa tích hợp; đó là một macro được định nghĩa trong một số tiêu đề C tiêu chuẩn, bao gồm <stddef.h>(hoặc <cstddef>). Làm thế nào để gcc "thực hiện các bước đối với C ++ 11" ảnh hưởng đến điều này? Tôi không thấy gì trong câu hỏi ngụ ý rằng mã (chưa thấy) được biên dịch với các phiên bản trước của gcc / g ++ hoặc với các phiên bản trước của tiêu chuẩn ngôn ngữ.

    – Tạ Hoàng Giang 17:58:40 23/09/2013
  • 1

    Đó chỉ là những gì tôi đã nói ở trên: Đã có trong C ++ 98, nó được định nghĩa trong cstddef. Vẫn gcc (và các trình biên dịch khác) chấp nhận mã đã sử dụng NULL mà không bao gồm cstddef trước. Tôi cũng khá chắc chắn mã (chưa thấy) trong câu hỏi được biên dịch với các phiên bản trước đó, mặc dù nó không tuân thủ tiêu chuẩn nghiêm ngặt. Bây giờ tôi chỉ đoán rằng hành vi chặt chẽ hơn của các phiên bản hiện đại này là do sự phát triển của trình biên dịch để hỗ trợ cú pháp C ++ 11.

    – Trịnh Kim Chi 19:18:57 24/09/2013
10

NULLkhông phải là một từ khóa; đó là một thay thế vĩ mô cho 0, và do thỏa thuận hợp stddef.hhay cstddef, tôi tin. Bạn chưa #includedcó tệp tiêu đề thích hợp, vì vậy g ++ xem NULLnhư một tên biến thông thường và bạn chưa khai báo nó.

|
4

Để hoàn thành các câu trả lời khác: Nếu bạn đang sử dụng C ++ 11, hãy sử dụng nullptr, đó là một từ khóa có nghĩa là một con trỏ trống trỏ đến null. (thay vì NULL, không phải là một loại con trỏ)

|
0

Bạn có thể khai báo macro NULL. Thêm vào đó sau #incolees của bạn:

#define NULL 0

hoặc là

#ifndef NULL
#define NULL 0
#endif

Không ";" ở cuối hướng dẫn ...

|
0

NULL cũng có thể được tìm thấy trong:

#include <string.h>

String.h sẽ lấy NULL từ một nơi khác.

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.