2014-06-14 12 views
5

वहाँ जबकि संकलन चेतावनी और त्रुटियों के लिए मजबूर करने मैक्रो के लिए एक रास्ता है?#warning और #Error के रूप में मैक्रो

#if defined(__clang__) 
# define PRAGMA(x)     _Pragma(#x) 
#elif defined(__GNUC__) 
# define PRAGMA(x)     _Pragma(#x) 
#elif defined(_MSC_VER) 
# define PRAGMA(x)     __pragma(x) 
#endif 

#define STRINGISIZE(str) #str 
#define STR(str)   STRINGISIZE(str) 

#define LINE     STR(__LINE__) 
#define FILE     __FILE__ 
#define FILE_LINE    __FILE__ "(" LINE ")" 

#define INFO(info , msg) \ 
    PRAGMA(message(FILE_LINE ": " #info ": " msg)) 

#define MESSAGE(m)   INFO(msg , m) 
#define WARNING(w)   INFO(warning , w) 
#define ERROR(e)   INFO(error , e) 
#define TODO(t)    INFO(TODO , t) 

int main() 
{ 
    MESSAGE("MSG") 
    TODO("TODO") 
    WARNING("WARN") 
    ERROR("ERROR") 
} 

विजुअल स्टूडियो 2013 के रूप में चेतावनी/त्रुटियों इन मैक्रो व्यवहार करेगा और इस उदाहरण संकलन नहीं होगा:

मैं वर्तमान में कुछ इस तरह की है। क्या जीसीसी और क्लैंग के बराबर है?


#if defined(_MSC_VER) 
    #define INFO(info , msg) \ 
     PRAGMA(message(FILE_LINE ": " #info ": " msg)) 
    #define MESSAGE(m)   INFO(info , m) 
    #define WARNING(w)   INFO(warning , w) 
    #define ERROR(e)   INFO(error , e) 
    #define TODO(t)    INFO(todo t) 
#elif defined(__GNUC__) || defined(__clang__) 
    #define INFO(info , msg) \ 
     PRAGMA(#info " : " #msg)) 
    #define MESSAGE(m)   INFO(info , m) 
    #define WARNING(w)   INFO(GCC warning , w) 
    #define ERROR(e)   INFO(GCC error , e) 
    #define TODO(t)    INFO(, "todo" t) 
#endif 
+0

प्रलेखन, आदमी पढ़ें। –

+1

मैं वास्तव में चाहता हूं कि लोग #pragma todo के आदि का उपयोग नहीं करेंगे। वे बिल्ड आउटपुट को अव्यवस्थित करते हैं और कभी भी – paulm

उत्तर

5

हाँ, वहाँ है। GCC preprocessor documentation का हवाला देते हुए:

#pragma GCC warning 
#pragma GCC error 

#pragma GCC warning "message" पाठ 'message' के साथ एक नैदानिक ​​चेतावनी जारी करने के लिए पूर्वप्रक्रमक कारण बनता है। प्रज्ञा में निहित संदेश एक स्ट्रिंग अक्षर होना चाहिए। इसी प्रकार, #pragma GCC error "message" एक त्रुटि संदेश जारी करता है। '#warning' और '#error' निर्देशों के विपरीत, इन pragmas '_Pragma' का उपयोग कर पूर्वप्रक्रमक मैक्रो में एम्बेड किया जा सकता है।

परीक्षण से पता चलता है कि यह काम भी झुकाव के साथ है।

ध्यान दें कि आप फ़ाइल और लाइन जानकारी एम्बेड करने के लिए जरूरत नहीं है। निर्देश नियमित डायग्नोस्टिक के रूप में आउटपुट होगा, और सभी डायग्नोस्टिक्स में पहले से ही फ़ाइल और लाइन जानकारी शामिल है।

प्रश्न में विशिष्ट मैक्रो के आधार पर, एक और विकल्प warning या error विशेषताओं के साथ चिह्नित फ़ंक्शन पर फ़ंक्शन कॉल को मजबूर करने के लिए हो सकता है। प्रागमाओं के विपरीत, फ़ंक्शन कॉल को पहुंचने योग्य नहीं माना जाता है (उदाहरण के लिए क्योंकि यह if ब्लॉक में दिखाई देता है जहां संकलन समय पर स्थिति हमेशा गलत होती है), इसलिए यदि आप उस मामले में चाहते हैं दबाए जाने की चेतावनी या त्रुटि, वे अधिक उपयुक्त हो सकते हैं।

+0

तय नहीं करते हैं, इसके लिए 3 घंटे की खोज कर रहे थे, धन्यवाद, आपने मुझे यह दिखाया :-) – nonsensation

+0

मैं प्रलेखन से उदाहरण का उपयोग करता हूं ' #pragma जीसीसी चेतावनी "संदेश" 'हालांकि मुझे निम्नलिखित आउटपुट मिलता है: 'चेतावनी: #pragma जीसीसी चेतावनी को अनदेखा कर रहा है [-विज्ञात-pragmas] | जीसीसी 4.7.1 – nonsensation

+2

@ सर्थी का उपयोग कर वे जीसीसी 4.8 के साथ शुरू हो रहा है। [यहां जीसीसी 4.7 दस्तावेज है] (https://gcc.gnu.org/onlinedocs/gcc-4.7.4/cpp/Pragmas.html), और [यहां जीसीसी 4.8 दस्तावेज है] (https: // gcc। gnu.org/onlinedocs/gcc-4.8.3/cpp/Pragmas.html) आप वे जोड़ दिया गया है देख सकते हैं। 'Warning' और' error' गुण लंबे समय तक के लिए उपलब्ध किया गया है, इसलिए यदि आप जीसीसी 4.8 में अपग्रेड नहीं कर सकते हैं, आप के बजाय उन का उपयोग कर सकते हैं। – hvd

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