का कारण बनता है, इसलिए, मुझे बस एक बड़े सर्वर एप्लिकेशन के एक शानदार बहु-घंटे डीबग सत्र के साथ मिल गया। त्रुटि अंततः एक निर्माता में एक मुश्किल ध्यान देने योग्य टाइपो के लिए नीचे आ गया। असल में, यह कुछ ऐसा था:मेरी प्रारंभिक सूची में छोटे टाइपो अनपेक्षित दर्द
template <class T>
class request_handler
{
public:
request_handler(T& request, Log& error_log)
: m_request(m_request), m_error_log(error_log)
{
/*... some code ... */
}
...
};
बग देखें? अच्छा, मैंने नहीं किया। समस्या प्रारंभकर्ता सूची में एक छोटा टाइपो है: m_request(m_request)
अपने लिए एक अनिवार्य संदर्भ असाइन कर रहा है। जाहिर है, इसे m_request(request)
पढ़ना है।
अब, सदस्य चर m_request
T&
प्रकार का है। तो - क्या कुछ कारण है कि संकलक ने मुझे चेतावनी नहीं दी है कि मैं यहां एक अनियमित चर का उपयोग कर रहा था?
-Wall
ध्वज के साथ जीसीसी 4.6 का उपयोग करना, अगर मैं कहूँ:
int x;
x = x;
... यह एक चेतावनी जारी करेगा: warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
तो, क्यों संकलक नहीं था मुझे चेतावनी जब मैं सौंपा m_request
खुद के लिए: अनिवार्य रूप से एक अनियमित संदर्भ असाइन करना? यह मुझे परेशानियों के घंटे बचा लिया होगा।
क्या आपने इसे पूर्ण अनुकूलन सक्षम (-O3) के साथ संकलित किया था? कंपाइलर केवल इन गलतियों में से कुछ को नोटिस करेगा जब यह वास्तव में डेटा-प्रवाह विश्लेषण करता है। बस एम_ उपसर्ग को छोड़ने पर विचार करें। 'foo (टी बार): बार (बार) 'पूरी तरह से अच्छी तरह से परिभाषित है। – xDD
पहले मैं अनुकूलन के साथ संकलित था। लेकिन डिबगिंग करते समय, मैं '-g3' ध्वज के साथ संकलित था इसलिए मैं डीबगर का उपयोग कर सकता था। यहां तक कि 'g3' ध्वज के साथ भी यह कोई चेतावनी जारी नहीं किया। – Channel72
मैं इस चेतावनी का कारण बनने के लिए '-g3' की अपेक्षा नहीं करता हूं, यह सब आपके प्रतीक को डंप कर देता है। – xDD