2012-01-10 22 views
5

परियोजना .pro फ़ाइल मैं निर्दिष्ट किया है में:जब मैं अपवादों का उपयोग करने का प्रयास करता हूं तो क्यूटी निर्माता में गैर-अपवादों के साथ मेरा कोड संकलित क्यों होता है?

QMAKE_CXXFLAGS += -fno-exceptions 

फिर भी मैं अपने अनुप्रयोग में अपवाद फेंक करने में सक्षम हूँ। उस पर कोई विचार?

उदाहरण: यह काम नहीं करना चाहिए, लेकिन यह निम्न

QMAKE_CFLAGS_RELEASE -= -fno-exceptions 

QMAKE_CXXFLAGS_RELEASE -= -fno-exceptions 
+1

क्यूटी लाइब्रेरी अपवादों का उपयोग नहीं करता है। –

+0

सवाल क्या है? सवाल यह है, "मेरा कोड संकलित क्यों करता है, मुझे उम्मीद है कि मैं असफल होने की कोशिश कर रहा हूं क्योंकि मैं गलत तरीके से कोड में अपवाद फेंकने की कोशिश कर रहा हूं जिसे मैं-अपवादों के साथ संकलित करने का प्रयास कर रहा हूं?" या सवाल यह है, "मैं क्यूटी के साथ अपने अपवाद-उपयोग कोड को सही तरीके से कैसे जोड़ूं?"? "उस पर कोई भी विचार" एसओ के लिए उचित रूप से व्यापक है, यह किसी दिए गए पाठ पर लोगों की व्यक्तिगत प्रतिक्रिया को मतदान करने के लिए यहां नहीं है ;-) –

+0

@ वोलोडिमर लेकिन मैं इसका उपयोग करता हूं। – smallB

उत्तर

11

आप QMAKE_CXXFLAGS सेट करके अपवाद बंद नहीं करते हैं क्योंकि यह विकल्प CONFIG द्वारा प्रबंधित किया जाता है। आपको

CONFIG-=exceptions 

का उपयोग बंद करने के लिए करना चाहिए।

जी ++ आर्ग देखें जब आप न QMAKE_CXXFLAGS और न ही CONFIG सेटिंग बदल गई है:

g++ -c -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp 

अब, चलो QMAKE_CXXFLAGS सेट कर सकते हैं: प्राप्त

g++ -c -fno-exceptions -O2 -frtti -fexceptions -mthreads -Wall <...> main.cpp 

ओह, हम मिल हमारे -fno-exceptionsCONFIG द्वारा ओवरराइड की गई है ' एस -fexceptions। अब, चलो CONFIG सेट कर सकते हैं:

g++ -c -O2 -frtti -Wall -fno-exceptions <...> main.cpp 
mingw32-make.exe[1]: Leaving directory `G:/proj/ingeritance' 
main.cpp: In function 'int qMain(int, char**)': 
main.cpp:22:15: error: exception handling disabled, use -fexceptions to enable 
mingw32-make.exe[1]: *** [release/main.o] Error 1 
mingw32-make.exe: *** [release] Error 2 

ओह! संकलन त्रुटि!

2

कोशिश।

यदि आपके पास अपवाद फेंकने वाले कोड (या लिंक) हैं, तो आप -fno-exceptions के साथ अपना कोड बनाकर जादुई रूप से उन्हें दूर नहीं कर सकते हैं। ध्वज वास्तव में अपवाद फेंकने वाले कोड से अधिक try और catch का समर्थन करने के लिए आवश्यक कोड की पीढ़ी को प्रभावित करता है।

विवरण के लिए GCC documentation देखें। दस्तावेज़ीकरण कहता है:

योग में, अपवाद हैंडलिंग के साथ वैध सी ++ कोड अपवाद हैंडलिंग के बिना एक बोली में परिवर्तित हो गया है।

तो, ऐसा लगता है कि कंपाइलर अपवाद-हैंडलिंग (और फेंकने) कोड को इसके उपयोग का पता लगाने और त्रुटि को ध्वजांकित करने के बजाय "दूर जाना" का कारण बनता है। उत्तरार्द्ध ऐसा लगता है जो आप उम्मीद कर रहे हैं, लेकिन वह उम्मीद है, तो, बस गलत है।

6

के दोनों उपयोग करने के लिए मैं थोड़ा प्रश्न से उलझन में हूँ काम करता है

#include <QApplication> 
#include <QtDebug> 

int main(int c, char**v) 
{ 
    QApplication app(c,v); 
    try 
    { 
     throw 1; 
    } 
    catch(int i) 
    { 

    } 
    return app.exec(); 
} 
+0

+1 का उपयोग करने में सक्षम हूं, शायद आपके द्वारा लिंक किए गए लाइब्रेरी दस्तावेज़ों से अधिक प्रासंगिक, यहां [कोड जनरेटर विकल्प पृष्ठ] है (http://gcc.gnu.org/onlinedocs/gcc-4.6 .2/जीसीसी/कोड-जनरल-Options.html # सूचकांक-fexceptions-2164)। – AProgrammer

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

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