gcc की चेतावनी "'के बाद शुरू की जाएगी'


228

मुझे 3rd पार्टी कोड से इन चेतावनियों का एक बहुत कुछ मिल रहा है जिसे मैं संशोधित नहीं कर सकता। क्या इस चेतावनी को निष्क्रिय करने का कोई तरीका है या कम से कम कुछ क्षेत्रों के लिए इसे अक्षम करें (जैसे कि #pragma push / pop in VC ++)?

उदाहरण:

list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after 
list.h:1117: warning:   `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_'

क्या आप वास्तविक चेतावनियों की एक-दो पंक्तियाँ पोस्ट कर सकते हैं? और यह भी बताएं कि क्या यह सी, सी ++ है, और यदि आपके पास स्रोत है, तो चेतावनी लिंकर या संकलन प्रक्रिया से आती है?
सीएसएल

जवाबों:


371

सुनिश्चित करें कि सदस्य प्रारंभिक सूची में उसी क्रम में दिखाई देते हैं जैसे वे कक्षा में दिखाई देते हैं

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

या आप मोड़ सकते हैं -Wno-reorder


91
यह महत्वपूर्ण btw क्यों है? यह चेतावनी क्यों मौजूद है?
एल्फ सेप

40
@ एलॉफ़ कुछ मामलों में (अनुशंसित नहीं), bऔर aप्रारंभिककरण एक दूसरे पर निर्भर हो सकते हैं। एक अनुभवहीन उपयोगकर्ता कुछ प्रभाव पाने के लिए प्रारंभिककरण आदेश को बदलने की कोशिश कर सकता है और चेतावनी यह स्पष्ट करेगी कि यह काम नहीं करता है।
गोरक्षक २ G

24
तो घोषणाओं के क्रम का अर्थ अर्थ है, भले ही घोषणाओं के बीच कोई संबंध न हो? कितनी निरर्थक!
Cuadue

10
यह स्पष्ट नहीं करता है कि यह चेतावनी क्यों मौजूद है और यह -Wno-reorderउल्लेख किए बिना कि किन समस्याओं के कारण हो सकता है। मुझे पता है कि ओपी ने किसी अन्य विवरण के लिए नहीं पूछा था, लेकिन इस तरह के अत्यधिक मतदान के जवाब से मुझे कम से कम इस संदर्भ और इसके बारे में उल्लेख करने की उम्मीद होगी। क्या हमें उस सवाल का जवाब नहीं देना चाहिए जो ओपी को लिखा जाना चाहिए था?
अंडरस्कोर_ड

4
@ सी.पी. बहुत जल्द खराब समय होगा, क्योंकि यह शुद्ध यूबी है।
अंडरस्कोर_ड


17

इस त्रुटि वाले qt का उपयोग करने वालों के लिए, इसे .pro फ़ाइल में जोड़ें

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

उपयोग -Wno-reorder(आदमी gcc अपने दोस्त है :))


6
वाह, आपको RT_M कहने के लिए एक नया तरीका मिला: MIYF (आदमी आपका दोस्त है) अगर आपको कोई आपत्ति नहीं है, तो मैं इसका इस्तेमाल करने जा रहा हूं :)
Oren S

4

यदि आप लाइब्रेरी हेडर से त्रुटियां देख रहे हैं और आप जीसीसी का उपयोग कर रहे हैं, तो आप हेडर को शामिल करने के -isystemबजाय चेतावनी का उपयोग करके अक्षम कर सकते हैं -I

क्लैंग में इसी तरह की विशेषताएं मौजूद हैं ।

आप CMake का उपयोग कर रहे हैं, तो आप निर्दिष्ट कर सकते हैं SYSTEMके लिए include_directories


क्या आप बता सकते हैं कि "निर्दिष्ट SYSTEM" कैसे करें ?
einpoklum

1
बस include_directoriesलाइन के अंत में स्ट्रिंग `सिस्टम` डालें ।
ड्रू नोक

1

आरंभीकरण का क्रम मायने नहीं रखता। सभी क्षेत्रों को उनके वर्ग / संरचना में उनकी परिभाषा के क्रम में आरंभीकृत किया गया है। लेकिन अगर इनिशियलाइज़ेशन लिस्ट में ऑर्डर अलग है gcc / g ++ इस चेतावनी को उत्पन्न करता है। इस चेतावनी से बचने के लिए केवल इनिशियलाइज़ेशन ऑर्डर बदलें। लेकिन आप इसके निर्माण से पहले आरंभीकरण में क्षेत्र का उपयोग नहीं कर सकते। यह एक रनटाइम त्रुटि होगी। इसलिए आप परिभाषा के क्रम को बदल दें। सावधान रहें और ध्यान रखें!


ओपी यह जानना चाहता था कि चेतावनी को कैसे निष्क्रिय किया जाए, न कि इसका क्या मतलब है या कोड को कैसे ठीक किया जाए। वास्तव में, पोस्ट कहता है कि कोड तृतीय पक्ष है और इसे संशोधित नहीं किया जा सकता है। वे परिभाषा के क्रम को नहीं बदल सकते हैं और शायद आरम्भिकरण का क्रम भी नहीं।
टिम सेग्यूनी

यह बहुत ज्यादा मायने रखता है अगर 2 वस्तु init सूची में 1 ऑब्जेक्ट से initd है, लेकिन वे शीर्ष लेख में गलत तरीके से घोषित किए गए हैं। उस स्थिति में, चीजें बहुत अजीब हो सकती हैं।
अंडरस्कोर_ड

0
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

आदेश महत्वपूर्ण है क्योंकि अगर बी से पहले इनिशियलाइज़ किया जाता है, और ए बी पर निर्भर है। अपरिभाषित व्यवहार दिखाई देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.