2010-11-01 7 views
6

मैं जी ++ 4.3.0 का उपयोग कर रहा इस उदाहरण संकलित करने के लिए: यदि मैं अधिकतम चेतावनी स्तर के साथ उदाहरण के संकलनएक चर का पता नहीं इस्तेमाल नहीं किया के रूप में

#include <vector> 

int main() 
{ 
    std::vector<int> a; 
    int b; 
} 

, मैं एक चेतावनी है कि चर है मिल इस्तेमाल नहीं किया:

[[email protected] data_create]$ g++ m.cpp -Wall -Wextra -ansi -pedantic 
m.cpp: In function ‘int main()’: 
m.cpp:7: warning: unused variable ‘b’ 
[[email protected] data_create]$ 

सवाल यह है: क्यों चर एक रूप में प्रयोग नहीं दर्ज नहीं किया जाता? वेरिएबल के लिए चेतावनी प्राप्त करने के लिए मुझे किन पैरामीटर पास करना होगा?

+0

कुछ जीसीसी कोड विश्लेषण चेतावनियां केवल अनुकूलन का उपयोग करते हैं (या बेहतर काम करते हैं), ओओ या ओओ –

+0

@Laurynas Biveinis के साथ प्रयास करें, मुझे लगता है कि उत्तर सही हैं। अनुकूलन स्तर इस मामले में कोई भूमिका निभाता है (यह सुनिश्चित करने के लिए कि मैंने कोशिश की)। –

उत्तर

23

सिद्धांत रूप में, std::vector<int> के लिए डिफ़ॉल्ट कन्स्ट्रक्टर मनमाने ढंग से दुष्प्रभाव हो सकता है, इसलिए संकलक यह नहीं समझ सकता कि a की परिभाषा को हटाकर प्रोग्राम के अर्थशास्त्र को बदल दिया जाएगा। आप केवल अंतर्निहित प्रकारों के लिए उन चेतावनियां प्राप्त करते हैं।

{ 
    lock a; 
    // ... 
    // do critical stuff 
    // a is never used here 
    // ... 
    // lock is automatically released by a's destructor (RAII) 
} 

हालांकि a पहली पंक्ति को हटाने के गलत होगा, इसकी परिभाषा के बाद इस्तेमाल कभी नहीं किया है:

एक बेहतर उदाहरण एक ताला है।

+0

उत्कृष्ट उत्तर/उदाहरण। मैंने कुछ समय पहले एक समान उदाहरण का इस्तेमाल किया जब एक ग्राहक को एक ही अवधारणा समझाती थी। क्लाइंट ने मुझे दांत और नाखून से लड़ा, बहस करते हुए कहा कि "लॉक ए" को अनुकूलित किया जाएगा क्योंकि इसका उपयोग नहीं किया गया था। मैंने समझाया कि इसे समाप्त नहीं किया जाना चाहिए (कन्स्ट्रक्टर/विनाशक के दुष्प्रभाव - म्यूटेक्स अधिग्रहण/रिलीज)। जैसा कि मुझे याद है, मुझे अंत में मानक में अध्याय और कविता मिलनी पड़ी जो मेरे बिंदु का समर्थन करता था। वापस खोजने और पोस्ट करने का प्रयास करेंगे। – Dan

1

एक अंतर्निहित प्रकार नहीं है। आप वास्तव में std::vector<int> के निर्माता को कॉल कर रहे हैं और परिणाम को ए को असाइन कर रहे हैं। कंपाइलर इसे उपयोग के रूप में देखता है क्योंकि निर्माता के दुष्प्रभाव हो सकते हैं।

1

वास्तव में इसे घोषित करने के बाद उपयोग किया जाता है क्योंकि इसके विनाशक को इसके दायरे के अंत में बुलाया जाता है।

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

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