2012-10-26 15 views
11

"जीएनयू बयान अभिव्यक्ति विस्तार का प्रयोग करें" मैं इस ऑब्जेक्टिव-सी istruction है।चेतावनी

MIN() मैक्रो के रूप में मानक NSObjCRuntime.h हेडर फाइल में परिभाषित किया गया है:

#if !defined(MIN) 
    #define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; }) 
#endif 

संकलन के दौरान, LLVM संकलक 4.1 पर प्रकाश डाला मेरी अनुदेश चेतावनी दिखा: "जीएनयू बयान अभिव्यक्ति विस्तार का प्रयोग करें"।

इसका क्या अर्थ है? क्या यह मेरी गलती है? यदि हां, तो मैं इसे कैसे ठीक कर सकता हूं? यदि नहीं, तो मैं कंपाइलर चेतावनी को कैसे हटा सकता हूं?

उत्तर

9

यह एक देर का जवाब है, मुझे पता है, लेकिन आप अपने संकलक झंडे में -Wno-gnu जोड़ कर इस संदेश से बच सकते हैं।

(Xcode 5 में मेरा मानना ​​है कि आप अपने प्रोजेक्ट के सेटिंग बिल्ड करने के लिए जा रहा है और "अन्य सी झंडे" है, जो "एप्पल LLVM 5.0   - कस्टम संकलक झंडे" में हैं -Wno-gnu जोड़कर इसे बदल सकते हैं। अनुभाग)

8

"वक्तव्य भाव" GNU सी संकलक का एक विस्तार है और आप बयान के एक समूह को निष्पादित करने के लिए, पिछले बयान का मूल्य लौटने की अनुमति देता है:

x = ({ 
    statement1; 
    statement2; 
    statement3; 
}); 

उपरोक्त उदाहरण में, x होगा मूल्य statement3 द्वारा लौटाया गया।

यह एक सुविधाजनक सुविधा है जो आपको बहु-कथन मैक्रोज़ रखने में सक्षम बनाती है जिसे आसानी से अन्य अभिव्यक्तियों में घोंसला जा सकता है। हालांकि, यह किसी भी सी मानक द्वारा परिभाषित नहीं है।

+4

धन्यवाद, बहुत रोचक। चूंकि 'MIN()' मैक्रो को ऐप्पल हेडर में परिभाषित किया गया है (जिसे मैं स्पष्ट रूप से नहीं बदल सकता), इस कोड को मेरे कोड में दबाने का एक तरीका है? – Dev

2

स्टेटमेंट एक्सप्रेशन घोषित कर दिया गया है।

आप प्रोजेक्ट सेटिंग्स को बदले बिना प्रगमा कोड का उपयोग कर चेतावनी को अनदेखा कर सकते हैं।

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wgnu" 

NSRange range = NSMakeRange(i, MIN(a, b)); 

#pragma GCC diagnostic pop 
संबंधित मुद्दे