2016-04-07 9 views
5

मैं शून्य के बजाय nullptr का उपयोग करना चाहते बराबर है। अब मैं एक सी समारोह (इस मामले में libjansson से) कॉल करता हूं।सी शून्य करने के लिए सी ++ 11 nullptr

सी में NULL कार्यान्वयन defined है।

nullptr के लिए मैंने पाया कि "एक शून्य सूचक स्थिरांक एक अभिन्न निरंतर अभिव्यक्ति (5.1 9) पूर्णांक प्रकार का अभिन्न अंग है जो शून्य का मूल्यांकन करता है"।

तो सबसे सुरक्षित बात करने के लिए:

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; 

क्या मैं वास्तव में है कि जरूरत है या मैं यह कर सकता सरल:

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

भाषा चुनें। तब भाषा आपको बताती है कि क्या उपयोग करना है। आप मिश्रण-एन-मैच नहीं कर सकते –

+6

@EdHeal: यह एक अंतर सवाल है। – user877329

+0

सी कार्यों के लिए जिन्हें आप सी ++ से कॉल कर रहे हैं, आप वहां उचित तर्कों में न्यूल का उपयोग करते हैं। अन्यथा nullptr का उपयोग करें। यदि सी ++ से सी में चल रहा है तो v v == nullptr? शून्य: v' और इसके विपरीत –

उत्तर

17

सी ++ 11 और उससे आगे के लिए, एक सूचक है कि है ==NULL==nullptr और इसके विपरीत भी होगा।

पॉइंटर की तुलना करने के अलावा NULL का उपयोग (जैसे स्ट्रिंग के अंत में नल बाइट का प्रतिनिधित्व करने के लिए इसका उपयोग करना) nullptr के साथ काम नहीं करेगा।

कुछ मामलों में, NULL#define NULL 0 है, क्योंकि पूर्णांक स्थिर 0 सी और सी ++ में विशेष रूप से cased है जब आप पॉइंटर्स के साथ इसकी तुलना करते हैं। इस गैर-प्रकार की प्रकार की जानकारी सी और सी ++ दोनों में कुछ समस्याएं पैदा करती है, इसलिए सी ++ में उन्होंने एक विशेष प्रकार और मूल्य बनाने का निर्णय लिया जो "उचित" उपयोग मामलों में एक ही चीज़ करता है, और विश्वसनीय रूप से " अनुचित "मामलों का उपयोग करें।

जहां तक ​​आपके C++ कार्यान्वयन सी कार्यान्वयन आप के साथ interoping कर रहे हैं (यह सच नहीं हो करने के लिए कम ही है) के साथ संगत है, सब कुछ काम करना चाहिए।


बहुत स्पष्ट होना करने के लिए, यदि ptr सूचक के किसी भी प्रकार है, उसके बाद निम्न भाव सी में बराबर हैं ++:

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

के रूप में निम्नलिखित हैं:

ptr = nullptr 
ptr = NULL 
ptr = 0 

और अगर X, कुछ प्रकार है, तो निम्न कथनों हैं:

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

nullptr अलग है जब आप इसे एक टेम्पलेट समारोह है कि टाइप deduces को पारित (NULL या 0 एक int जबकि nullptr एक nullptr_t बनी हुई है बन जब तक एक तर्क एक सूचक की उम्मीद करने के लिए पारित किया है,), और जब कुछ संदर्भों में इस्तेमाल किया जहां nullptr नहीं होगा संकलित करें (जैसे char c = NULL;) (नोट, char* c=NULL;)