2016-03-29 11 views
12

मुझे Q_NULLPTR क्यूटी स्रोत कोड और उदाहरणों में उदारता से उपयोग किया जा रहा है, लेकिन मुझे इसका कोई दस्तावेज नहीं मिला है कि यह वास्तव में क्या है और इसका उपयोग कब किया जाना चाहिए।Q_NULLPTR का उपयोग कब करें?

नई क्यूटी SerialBus मॉड्यूल नई क्यूटी v5.6 में जोड़ा के इस आधिकारिक demonstration में

उदाहरण के लिए:

if (!m_canDevice->connectDevice()) { 
    delete m_canDevice; 
    m_canDevice = Q_NULLPTR; 

इस से पहले कि में जोड़ा जा रहा है सी ++ 11 nullptr के उद्देश्य को पूरा किया? यदि ऐसा है, तो अब हमारे पास सी ++ 11 है, क्या मुझे Q_NULLPTR का उपयोग करना चाहिए?

पीएस: मैंने मैक्रो की परिभाषा के लिए क्यूटी स्रोत कोड खोजने की कोशिश की लेकिन इसे खोजने में असफल रहा।

उत्तर

9

क्या यह सी ++ 11 में जोड़े जाने से पहले नलप्टर के उद्देश्य को पूरा करता है? यदि ऐसा है, तो अब हमारे पास सी ++ 11 है, क्या मुझे Q_NULLPTR का उपयोग करना चाहिए?

हां (कुछ हद तक) और क्रमशः नहीं।

सी ++ दिनों में काफी कमी आई थी, इसलिए क्यूटी की अपनी सामग्री थी, जो बाद में सी ++ सुविधाओं पर पकड़े गए के रूप में अप्रचलित हो गई।

कहा जा रहा है, Q_NULLPTR (था) नहीं कार्यात्मक, nullptr रूप में ही है (जैसा कि आंद्रेई बताया गया है, यदि सी ++ 11 समर्थित है यह nullptr तक विस्तारित है) यह आप प्रकार सुरक्षा, बस वाक्य रचना नहीं दिया " चीनी"। इसने कोड पढ़ने वाले व्यक्ति को इरादा दिखाया, संकलक को नहीं nullptr करता है।

13

Q_NULLPTR, एक मैक्रो है संकलक C++ 11 का समर्थन करता है कि nullptr के रूप में बदल दिया जाता है और NULL के रूप में (जो 0 के रूप में बदल दिया जाता है) करता है, तो ऐसा नहीं है। यदि आप सी ++ 11 का उपयोग करते हैं, तो आप इसके बजाय nullptr लिख सकते हैं; यदि आप नहीं करते हैं तो NULL का उपयोग करें।

+0

किसी को सबूत की आवश्यकता होने पर – dtech

+5

[यहां स्रोत कोड] (https://code.woboq.org/qt5/qtbase/src/corelib/global/qcompilerdetection.h.html#990) जानना अच्छा है। – thuga

2

संकलक स्वतंत्र रहने के लिए Q_NULLPTR का उपयोग करें।

यदि अब आप nullptr का उपयोग करने का निर्णय लेते हैं, तो आपका कोड पुराने सी ++ 98 कंपाइलर के साथ संकलित नहीं होगा। यदि आप NULL का उपयोग करने का निर्णय लेते हैं, तो आप सी ++ 11 प्रकार की सुरक्षा खो देते हैं, भले ही आपके वर्तमान कंपाइलर में उपलब्ध हो।

इसी कारण मैक्रोज़ qMove(x) और संबंधित परिभाषित Q_COMPILER_RVALUE_REFS मौजूद है।

संबंधित मुद्दे