2012-04-17 18 views
7

के रूप में उपयोग किया जा सकता है हमारे पास int foo(const char* bar); के साथ एक फ़ंक्शन मैक्रो #define FOO(arg) foo(arg) है। जब एनडीईबीयूजी परिभाषित किया जाता है तो खाद्य को #define FOO(arg) 0 के रूप में परिभाषित किया जाता है, हालांकि इससे कई कंपाइलर चेतावनियां होती हैं क्योंकि कई मामलों में फू का रिटर्न मूल्य उपयोग नहीं किया जाता है। समाधान एएनएसआई सी कंपाइलर्स के साथ काम करना चाहिए और कोई चेतावनी नहीं है। मैं कोशिश की है:फ़ंक्शन मैक्रो जो शून्य का मूल्यांकन करता है और

(void)0: चर

static int foo(const char* bar) { return 0; } को assigend नहीं किया जा सकता: कुछ मॉड्यूल

static inline int foo(const char* bar) { return 0; } में अप्रयुक्त स्थिर समारोह चेतावनी का कारण बनता है: केवल C99 compilers के साथ काम करता

के लिए धन्यवाद अपने मदद!

संपादित 1: यह कुछ हद तक एक ट्रेस मैक्रो की तरह है और पूरे प्रोजेक्ट में उपयोग किया जाता है। अधिकांशतः इसे FOO("function x called"); जैसे बयान के रूप में उपयोग किया जाता है, लेकिन कुछ मामलों में मैंने if (FOO("condition a")) { /* some more debug output */ } देखा। एनडीईबीयूजी परिभाषित और अनुकूलन सक्षम करने के साथ कुछ भी खाद्य पदार्थों से नहीं छोड़ा जाना चाहिए। मैं इसके साथ नहीं आया, लेकिन मुझे इस गड़बड़ी को साफ करना है :)।

EDIT2: मैं जोड़ने चाहिए बनाता है कि जीसीसी रिहाई के इन चिह्नों उपयोग किया जाता है: -O3 -Wall -ansi

edit3: अब मैं __inline int dummy() { return 0; } साथ जा रहा हूँ के लिए। __inline उत्तर मोड में विजुअलसी और जीसीसी दोनों के साथ काम करता है।

+2

आप कैसे 'FOO()' अपने कोड में प्रयोग किया जाता है की अधिक उदाहरण दिखा सकते हैं? – unwind

+3

क्या आप हमेशा रिटर्न वैल्यू का उपयोग करते हैं, उदाहरण के लिए, 'printf() '? – pmg

+0

यदि आपको foo() को कॉल करने में कोई फर्क नहीं पड़ता है और बस यह सुनिश्चित करना चाहते हैं कि उपयोग किए गए रिटर्न वैल्यू 0 है तो आप अल्पविराम ऑपरेटर का उपयोग कर सकते हैं और '# परिभाषित खाद्य (तर्क) (foo (arg), 0) ' – Eregrith

उत्तर

2

क्या आप चेतावनी रोकने के लिए क्या कर सकता है निम्नलिखित:

#ifndef NDEBUG 
    #define FOO(arg) foo(arg) 
#else 
    #define FOO(arg) abs(0) 
#endif 

मैं यह नहीं कह रहा हूँ यह आदर्श है (आप, हर जगह शामिल किया गया है सुनिश्चित करें stdlib.h बनाने के लिए होगा, उदाहरण के लिए), लेकिन यह चेतावनी को रोकता है।

+0

संपादित करें यह काम कर सकता है लेकिन जैसा कि आप कहते हैं कि यह आदर्श नहीं है। मुझे यह जांचना होगा कि संकलक इसे रिलीज बिल्ड में हटा देगा या नहीं। – maep

+0

@maep: हाँ मैंने उस मुद्दे के बारे में भी सोचा था। हालांकि, मुझे उम्मीद है कि कोई भी सभ्य संकलक रिलीज बिल्ड में इसे हटा देगा। बीटीडब्ल्यू, जीसीसी इसे 'ओओ' पर भी हटा देता है। – Job

+0

कुछ कंपाइलर शुद्ध कार्य को कॉल करने और वापसी मूल्य का उपयोग न करने के बारे में चेतावनी दे सकते हैं ... –

1

मैं ऐसा कुछ करता हूं जो सी संस्करण पर निर्भर है। हेडर फाइल में:

में
#if __STDC_VERSION__ > 199900L 
inline int foo(const char* bar) { return 0; } 
#else 
int foo(const char* bar); 
#endif 

एक संकलन इकाई

#if __STDC_VERSION__ < 199900L 
int foo(const char* bar) { return 0; } 
#else 
int foo(const char* bar); 
#endif 

या नौकरी के जवाब की तरह बूढ़ा सा सी संस्करण कुछ के लिए उपयोग करते हैं, कि एक समारोह है कि कुछ है बाहर अनुकूलित किया जा रहा है लेकिन यह है कि 'नहीं करता है चेतावनी उत्पन्न नहीं करते हैं।

3

मुझे लगता है कि यह एक छोटा सा संकलक निर्भर है, लेकिन यह काम करना चाहिए:

#ifndef NDEBUG 
    #define FOO(arg) foo(arg) 
#else 
    #define FOO(arg) ((int)0) 
#endif 

यह रोकता चेतावनी "अभिव्यक्ति कोई प्रभाव नहीं है", यह कुछ नहीं करता है और जब इस्तेमाल किया अपने मूल्य अभी भी 0.

है

संपादित
ऐसा लगता है कि यह कुछ तो पोर्टेबल नहीं है तो (अब) आप इन शर्तों है:

  • (0) या ((int)0) काम कम से कम कुलपति 2010 को
  • __noop 2003 के बाद कुलपति के किसी भी संस्करण पर काम करना चाहिए।

वीसी 6 कोई समस्या नहीं है क्योंकि यह C4555 चेतावनी को उत्सर्जित नहीं करता है। अन्य compilers के लिए आप उपयोग कर सकते हैं:

  • ((void)0, 0) यह compilers का एक बहुत पर काम कर सकते हैं (शायद यह अधिक पोर्टेबल एक है?)।
  • inline int foo(const char* bar) { return 0; } किसी भी अन्य सी 99 कंपाइलर के साथ काम करता है (जैसा कि आपने लिखा है कि आपको इसे static जीसीसी पर घोषित करने की आवश्यकता हो सकती है)।

किसी अन्य प्रागैतिहासिक सी संकलक के लिए समाधान @Jobs द्वारा बताया उपयोग करें: abs(0)

+0

दिलचस्प, मुझे आश्चर्य है कि यह क्यों काम करता है ... ध्यान दें कि जीसीसी पर, कास्ट भी आवश्यक नहीं है। – Job

+0

मुझे अभी भी चेतावनी मिलती है -Wall – maep

+0

@maep क्या आप वीसी का उपयोग कर रहे हैं? मैं 2k10 का उपयोग कर रहा हूं और यह कोई चेतावनी नहीं देता है (जैसा कि ज्यादातर कंपाइलरों में नौकरी द्वारा इंगित किया गया है, यहां तक ​​कि कलाकार अनावश्यक है)। आपको किस प्रकार की चेतावनी मिलती है? –

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