2016-04-07 24 views
5

Tôi thích sử dụng nullptr thay vì NULL. Bây giờ tôi gọi một hàm C (từ libjansson trong trường hợp này).Là C NULL bằng C++ 11 nullptr

NULL trong C đang triển khai defined.

Đối với nullptr Tôi thấy rằng "Hằng số con trỏ null là biểu thức hằng số không thể tách rời (5.19) rvalue của kiểu số nguyên ước lượng bằng không".

Vì vậy, điều an toàn nhất để làm:

auto string_obj=json_object_get(m_handle,name); 
if(string_obj!=NULL) 
    { 
    auto string=json_string_value(string_obj); 
    if(string!=NULL) 
     {return string;} 
    } 
return nullptr; 

Tôi có thực sự cần điều đó hoặc tôi có thể làm điều đó đơn giản hơn:

auto string_obj=json_object_get(m_handle,name); 
if(string_obj!=nullptr) 
    { 
    return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr 
    } 
return nullptr; 
+0

Chọn ngôn ngữ. Ngôn ngữ sau đó sẽ cho bạn biết những gì để sử dụng. Bạn không thể kết hợp-n-phù hợp với –

+6

@EdHeal: Đây là một câu hỏi về khả năng tương tác. – user877329

+0

Đối với các hàm C mà bạn đang gọi từ C++, bạn sử dụng NULL trong đó các đối số thích hợp. Nếu không thì sử dụng nullptr. Nếu chuyển từ C++ sang C thì 'v == nullptr? NULL: v' và ngược lại –

Trả lời

17

Trong C++ 11 và xa hơn nữa, một con trỏ đó là ==NULL cũng sẽ ==nullptr và ngược lại.

Sử dụng NULL ngoài việc so sánh với con trỏ (như sử dụng nó để biểu thị byte nul ở cuối chuỗi) sẽ không hoạt động với nullptr.

Trong một số trường hợp, NULL#define NULL 0, vì hằng số nguyên 0 được đặt biệt trong C và C++ khi bạn so sánh với con trỏ. Thông tin kiểu không kiểu này gây ra một số vấn đề trong cả C và C++, vì vậy trong C++, họ quyết định tạo một kiểu và giá trị đặc biệt thực hiện tương tự trong trường hợp sử dụng "thích hợp" và không thể biên dịch một cách đáng tin cậy trong phần lớn " trường hợp sử dụng không đúng.

Tức là triển khai C++ của bạn tương thích với triển khai C bạn đang xen kẽ với (rất hiếm khi điều này không đúng), mọi thứ sẽ hoạt động.


Để được rất rõ ràng, nếu ptr là bất kỳ loại con trỏ, sau đó các khái niệm sau là tương đương trong C++:

ptr == nullptr 
ptr == NULL 
ptr == 0 
!ptr 

Như như sau:

ptr = nullptr 
ptr = NULL 
ptr = 0 

và nếu X là một số loại, như sau:

X* ptr = nullptr; 
X* ptr = NULL; 
X* ptr = 0; 

nullptr khác khi bạn vượt qua nó vào một mẫu hàm deduces gõ (NULL hoặc 0 trở thành một int trừ khi truyền cho một cuộc tranh cãi mong đợi một con trỏ, trong khi vẫn còn là một nullptrnullptr_t), và khi được sử dụng trong một số bối cảnh nơi nullptr sẽ không biên dịch (như char c = NULL;) (lưu ý, không phải char* c=NULL;)