it-swarm-vi.com

Tại sao NULL không được khai báo?

Tôi gặp vấn đề với công cụ cấu trúc này khi tôi cố gắng biên dịch mã này:

typedef struct Node
{
    Node( int data ) //
    {
        this->data = data;
        previous = NULL; // Compiler indicates here
        next = NULL;
    }

    int data;
    Node* previous;
    Node* next;
} NODE;

khi tôi xảy ra lỗi này:

\linkedlist\linkedlist.h||In constructor `Node::Node(int)':|
\linkedlist\linkedlist.h|9|error: `NULL' was not declared in this scope|
    ||=== Build finished: 1 errors, 0 warnings ===|

Vấn đề cuối cùng là struct, nhưng nó hoạt động tốt khi nó nằm trong main.cpp của tôi, lần này là trong một tệp tiêu đề và đang cho tôi vấn đề này. Tôi đang sử dụng Code :: Blocks để biên dịch mã này

76
TheTeh

NULL không phải là hằng số tích hợp trong các ngôn ngữ C hoặc C++. Trong thực tế, trong C++, nó ít nhiều lỗi thời, chỉ cần sử dụng một chữ đơn giản 0 thay vào đó, trình biên dịch sẽ thực hiện đúng tùy theo ngữ cảnh.

Trong C++ mới hơn (C++ 11 trở lên), sử dụng nullptr (như được chỉ ra trong một nhận xét, cảm ơn).

Nếu không, thêm

#include <stddef.h>

để có được định nghĩa NULL.

126
unwind

Đừng dùng NULL. Dù sao nó cũng chỉ là #d xác định là 0 và rất hữu ích để phân biệt về mặt ngữ nghĩa với số nguyên 0.

Có vấn đề với việc sử dụng 0 (và do đó NULL). Ví dụ:

void f(int);
void f(void*);

f(0); // Ambiguous. Calls f(int).

Phiên bản tiếp theo của C++ (C++ 0x) bao gồm nullptr để sửa lỗi này.

f(nullptr); // Calls f(void*).
33
Tim

NULL không phải là một phần gốc của ngôn ngữ C++ cốt lõi, nhưng nó là một phần của thư viện chuẩn. Bạn cần bao gồm một trong các tệp tiêu đề bao gồm định nghĩa của nó. #include <cstddef> hoặc #include <stddef.h> là đủ.

Định nghĩa của NULL được đảm bảo có sẵn nếu bạn bao gồm cstddef hoặc stddef.h. Điều đó không được bảo đảm, nhưng bạn rất có thể đưa định nghĩa của nó đi kèm nếu bạn bao gồm nhiều tiêu đề tiêu chuẩn khác thay thế.

14
CB Bailey

Bạn có bao gồm "stdlib.h" hoặc "cstdlib" trong tập tin này không? NULL được định nghĩa trong stdlib.h/cstdlib

#include <stdlib.h>

hoặc là

#include <cstdlib>  // This is preferrable for c++
9
Andy White

Không sử dụng NULL, C++ cho phép bạn sử dụng 0 chưa được thay thế:

previous = 0;
next = 0;

Và, như tại C++ 11, bạn thường không nên sử dụng NULLhoặc0 vì nó cung cấp cho bạn nullptr loại std::nullptr_t, phù hợp hơn với nhiệm vụ.

4
paxdiablo