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 mà tôi không biết tại sao. Tại sao?
Cảm ơn.
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 mà tôi không biết tại sao. Tại sao?
Cảm ơn.
Câu trả lời:
NULL
không phải là một từ khóa. Đó là một số nhận dạng được xác định trong một số tiêu đề chuẩn. 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
.
nullptr
từ khóa, đây là một từ khóa thực tế và không yêu cầu bất kỳ #include
s. Nó cũng an toàn hơn NULL
.
GCC đang thực hiện các bước hướng tới C ++ 11, đó có thể là lý do tại sao bây giờ bạn cần bao gồm 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 kiểu tích phân, vì vậy nó có thể được sử dụng để phân biệt lời gọi đến một hàm đã được nạp chồng cho cả kiểu 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.
NULL
chưa bao giờ là một từ khóa được tích hợp sẵn; nó là một macro được xác định trong một số tiêu đề C tiêu chuẩn, bao gồm <stddef.h>
(hoặc <cstddef>
). Gcc "thực hiện các bước hướng tới C ++ 11" ảnh hưởng như thế nào đến điều này? Tôi không thấy gì trong câu hỏi ngụ ý rằng mã (không nhìn 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ữ.
NULL
không phải là một từ khóa; nó là một thay thế macro cho 0 và có stddef.h
hoặc cstddef
, tôi tin. Bạn không #included
có tệp tiêu đề thích hợp, vì vậy g ++ xem NULL
như một tên biến thông thường và bạn chưa khai báo nó.
Để 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
, đây là một từ khóa có nghĩa là con trỏ void trỏ đến null. (thay vì NULL
, không phải là loại con trỏ)