2010-08-26 38 views
22

thể trùng lặp:
Do you use NULL or 0 (zero) for pointers in C++?Sử dụng NULL trong C++?

có phải là một ý tưởng tốt để sử dụng NULL trong C++ hay chỉ là giá trị 0?

Có trường hợp đặc biệt nào sử dụng NULL trong mã C gọi từ C++ không? Giống như SDL?

+0

lưu ý rằng 'NULL == 0' chỉ là một quy ước. NULL có thể được định nghĩa với một số giá trị khác, mặc dù đó sẽ là một trường hợp hiếm hoi. –

+0

Tôi muốn đặt ra điều này theo cách khác-- nếu bạn đang giới thiệu ngữ nghĩa đến một con trỏ không hợp lệ, tại sao * sẽ không * bạn sử dụng NULL, đó là cho chính xác điều đó? –

+2

Chắc chắn đây là một câu hỏi trùng lặp. –

Trả lời

25

Trong C++ NULL mở rộng thành 0 hoặc 0L. Xem nhận xét này từ Stroustrup:

Tôi có nên sử dụng NULL hoặc 0 không? Trong C++, định nghĩa của NULL là 0, do đó, có chỉ là sự khác biệt thẩm mỹ. Tôi thích để tránh macro, vì vậy tôi sử dụng 0. Một vấn đề khác với NULL là mọi người đôi khi nhầm lẫn tin rằng nó khác 0 và/hoặc không phải là số . Trong mã chuẩn, NULL đôi khi được xác định là một cái gì đó không phù hợp và do đó đã có/đã được tránh. Điều này ít phổ biến hơn trong các ngày ngày này.

Nếu bạn phải đặt tên con trỏ null, gọi nó là nullptr; đó là những gì nó là sẽ được gọi trong C++ 0x. Sau đó, "nullptr" sẽ là một từ khóa.

+1

Tôi nghĩ rằng tôi phải không đồng ý với Stroustrup trên bit cuối cùng. Tôi muốn tránh sử dụng nullptr trong các hệ thống mà nó chưa được thực hiện vì lý do chính xác mà nó sẽ sau này. Hành vi của từ khóa nullptr không thể được nhân rộng với một định nghĩa tích phân. Tôi không nghĩ rằng nó có thể được nhân rộng ở tất cả. Bạn có thể chạy vào các tình huống mà mã của bạn làm một điều một ngày và sau đó tiếp theo, sau khi nâng cấp trình biên dịch, một cái gì đó hoàn toàn khác nhau. Về cơ bản, mọi thứ từ khóa 'nullptr' có nghĩa là địa chỉ sẽ thay đổi. –

+1

Cảm ơn, người đàn ông! Điều này thực sự hữu ích. #define nullptr 0 có giúp được gì không? – Jookia

+0

@Jookia: Không! Không sử dụng '#define nullptr 0' trong mã của bạn, đọc bình luận của Noah Roberts ở trên. Nếu bạn làm điều đó, khi bạn nâng cấp lên trình biên dịch tuân thủ C++ 0x, mã của bạn có thể không biên dịch (đó sẽ là một điều tốt) hoặc làm những thứ kỳ lạ. – Praetorian

2

Từ crtdbg.h (và nhiều tiêu đề khác):

#ifndef NULL 
#ifdef __cplusplus 
#define NULL 0 
#else 
#define NULL ((void *)0) 
#endif 
#endif 

Do đó NULL0, ít nhất là trên nền tảng Windows. Vì vậy, không, không phải là tôi biết.

1

Tôi không bao giờ sử dụng NULL trong mã C hoặc C++ của mình. 0 hoạt động tốt, cũng như if (ptrname). Bất kỳ lập trình viên C hoặc C++ nào có thẩm quyền nên biết những gì họ làm.

+0

Vì tôi hiếm khi sử dụng con trỏ (tất cả chúng đều nằm bên trong con trỏ thông minh), nó tạo ra sự khác biệt nhỏ. –

+0

Bây giờ C++ 11 là chuẩn mới nhất, được sử dụng rộng rãi, tôi nghi ngờ bạn cũng chuyển sang 'nullptr'. – peterh

+0

@peterh - Yup. Đây là một bài viết thực sự sớm (6yo) của tôi. Những ngày này tôi cũng sẽ thúc đẩy để chỉ ra rằng bạn cũng nên cố gắng tránh sử dụng con trỏ hoàn toàn (tương tự như bình luận của Loki, nhưng cố gắng thậm chí không cần những "thông minh"). Các ngữ nghĩa di chuyển mới làm cho việc này dễ dàng hơn nhiều. –

10

Nhược điểm của NULL trong C++ là giá trị 0. Đây là giá trị có thể được chuyển đổi thành con trỏ, giá trị bool, float/double hoặc int.

Đó không phải là loại rất an toàn và đã dẫn đến lỗi thực tế trong một ứng dụng tôi đã làm việc trên.

Hãy xem xét điều này:

void Foo(int i); 
void Foo(Bar* b); 
void Foo(bool b); 


main() 
{ 
    Foo(0);   
    Foo(NULL); // same as Foo(0) 
} 

C++ 11 định nghĩa một nullptr đó là chuyển đổi thành một con trỏ null nhưng không vô hướng khác. Điều này được hỗ trợ trong tất cả các trình biên dịch C++ hiện đại, bao gồm VC++ vào năm 2008. Trong các phiên bản cũ của GCC có một tính năng tương tự, nhưng sau đó nó được gọi là __null.

0

Giả sử bạn không có thư viện hoặc tiêu đề hệ thống xác định NULL chẳng hạn như (void*)0 hoặc (char*)0 thì không sao. Tôi luôn luôn có xu hướng sử dụng 0 bản thân mình vì nó là do định nghĩa con trỏ null. Trong C++ 0x bạn sẽ có sẵn nullptr để câu hỏi không còn quan trọng nữa.