2016-03-06 11 views
5

जी ++ और -Waggregate-returnचुप्पी करने की कोशिश कर रहा है- g ++ - बग्गी कंपाइलर के लिए केवल मैक्रो में कुल-वापसी?

#define DOCTEST_CHECK(expr)          \ 
    do {               \ 
     _Pragma("GCC diagnostic push");       \ 
     _Pragma("GCC diagnostic ignored \"-Waggregate-return\"");\ 
     if(Result failed = (ExpressionDecomposer() << expr))  \ 
      printf("%s\n", failed.m_decomposition.c_str());  \ 
     _Pragma("GCC diagnostic pop");       \ 
    } while(false) 

DOCTEST_CHECK(true == false); // produces warnings 

लेकिन हाथ संस्करण द्वारा unrolled कोई चेतावनी का उत्पादन नहीं करता साथ संकलन का उपयोग कर:

do {                       
    _Pragma("GCC diagnostic push");                
    _Pragma("GCC diagnostic ignored \"-Waggregate-return\"");         
    if(Result failed = (ExpressionDecomposer() << true == false))  
     printf("%s\n", failed.m_decomposition.c_str());           
    _Pragma("GCC diagnostic pop");                
} while(false); 

व्यवहार ही होना नहीं करना चाहिए?

मुझे नहीं लगता कि Result और ExpressionDecomposer प्रकारों की बात है - बस कक्षाएं।

मैं अभिव्यक्ति अपघटन को here (चीजों का नाम बदलकर थोड़ा सा) प्राप्त करने की कोशिश कर रहा हूं।

संपादित करें: क्यों: >>here < < ऐसा न हो कि पुस्तकालय

मेरा प्रश्न है का उपयोग कर समस्या का एक लाइव डेमो है? मैक्रो का उपयोग कर पहले मामले में मैं कैसे चेतावनी मुक्त कर सकता हूं? मैं दुनिया भर में चेतावनी को शांत करने का जोखिम नहीं उठा सकता।

+0

मुझे पता है कि यह सवाल का जवाब नहीं देता है, लेकिन '-उग्रेगेट-रिटर्न' बल्कि पैडेंटिक लगता है और इसे अनदेखा किया जाना चाहिए, खासकर सी ++ में जहां मूल्य द्वारा लौटाना बिल्कुल सामान्य है। आप [इस सवाल] पर एक नज़र डाल सकते हैं (http://stackoverflow.com/questions/14016993/confusion-in-regards-to-purpose-behavior-of-waggregate-return)। –

+1

मैं मैक्रोज़ में प्रागम्स के साथ मुद्दों वाले जीसीसी को अस्पष्टता से याद करता हूं; आप अपने बगजिला को खोजना चाहेंगे। –

+0

@AlexandreC। मैं व्यक्तिगत कोड के लिए कभी भी उस चेतावनी का उपयोग नहीं करता लेकिन लाइब्रेरी जो मैं लिख रहा हूं उसे सबसे आक्रामक स्तरों पर भी पूरी तरह से चेतावनी दी जानी चाहिए (मैं पूर्णता से पीड़ित हूं) ... यह चेतावनी '' '-Wall' अच्छे कारण के लिए '' या '' '-Wextra''' ... – onqtam

उत्तर

1

ये कीड़े प्रासंगिक लग रही:

तो यह लाइन नंबर तुलना से कोई लेना देना हो सकता है, या कुछ पार्सर के भीतर एक ही समस्या है, और यह कुछ भविष्य में तय किया जा सकता है v ersion।

+0

वाह को संकलित नहीं करेंगे जो बहुत सामान्य लगता है ... अब तक मैंने केवल '' rragma''' के साथ क्लैंग चेतावनियों को चुप कर दिया है और यह ठीक काम करता है ... अजीब बात यह है कि जीसीसी इतने लंबे समय तक काम नहीं कर रहा है – onqtam

+0

@onqtam यह एक मैक्रो के बाहर ठीक काम करेगा, और पहली बग रिपोरी के अनुसार, सी। जीसीसी बग में भी किसी को तय करने में रुचि रखने के आधार पर तय किया जाएगा बग; कुछ प्रचार प्रचार नहीं करता है लेकिन बहुत पुरानी अनसुलझा बग हैं। चेतावनी कीड़े आमतौर पर गंभीर नहीं हैं, afaik। – rici

+0

@onqtam वैसे, आपको उस मैक्रो में 'expr' कोष्ठक करने की आवश्यकता है (जहां इसका उपयोग किया जाता है, प्रोटोटाइप में नहीं।) – rici

-2

आप की कोशिश कर सकते:

#define DOCTEST_CHECK(expr)          \ 
do {               \ 
    _Pragma("GCC diagnostic push");       \ 
    _Pragma("GCC diagnostic ignored \"-Waggregate-return\"");\ 
    if(Result failed = (ExpressionDecomposer() << (expr)))  \ 
     printf("%s\n", failed.m_decomposition.c_str());  \ 
    _Pragma("GCC diagnostic pop");       \ 
} while(false) 
+0

भी – onqtam

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