2010-09-30 10 views
65

मैं डीबगिंग उद्देश्यों के लिए की तरहक्या सी प्रीप्रोसेसर से संदेश प्रिंट करने का कोई पोर्टेबल तरीका है?

#print "C Preprocessor got here!" 

कुछ करने के लिए सक्षम होने के लिए करना चाहते हैं। ऐसा करने के लिए सबसे अच्छा/सबसे पोर्टेबल तरीका क्या है?

उत्तर

72

warning निर्देश शायद निकटतम आप मिल जाएगा है, लेकिन यह पूरी तरह से मंच स्वतंत्र नहीं है:

#warning "C Preprocessor got here!" 

AFAIK इस MSVC को छोड़कर सबसे compilers, जिस पर आप एक pragma का उपयोग करना होगा पर काम करता है निर्देश:

#pragma message ("C Preprocessor got here!") 
+5

जो सवाल पूछता है, क्या आप किसी भी तरह से "प्रगमा संदेश" और "चेतावनी" को स्वैप करने के लिए संकलन ध्वज के आधार पर निर्देश दे सकते हैं? उदाहरण के लिए, कुछ ऐसा: '#ifdef _LINUX #define #preprocmsg "# चेतावनी" अन्य #define #preprocmsg "#pragma संदेश" '... मुझे यह कोशिश करनी होगी लेकिन वृत्ति मुझे बताती है कि जवाब नहीं है। – Bryan

+6

@ ब्रायन: हाँ। '# परिभाषित चेतावनी (msg) _Pragma (" संदेश "#msg)' –

+1

#pragma संदेश() gcc के पुराने संस्करणों (जैसे जीसीसी 4.1.2, आरएचईएल 5 पर डिफ़ॉल्ट संस्करण) द्वारा समर्थित नहीं है। मुझे अभी तक इन पुराने संस्करणों के लिए उपयुक्त समकक्ष नहीं मिला है - # चेतावनी महान नहीं होगी, क्योंकि चेतावनियों को आम तौर पर हमारे लिए त्रुटियों के रूप में माना जाता है, और हम वास्तव में संदेश को सूचनात्मक रूप से पसंद करना चाहते हैं, संकलन। –

-16

आप नहीं कर सकते। पूर्व कोड प्रोसेसर को सी कोड से पहले संसाधित किया जाता है। स्क्रीन पर प्रिंट करने के लिए कोई प्रीप्रोसेसर निर्देश नहीं हैं, क्योंकि प्रीप्रोसेसर कोड निष्पादित नहीं किया जाता है, इसका उपयोग सी कोड उत्पन्न करने के लिए किया जाता है जिसे निष्पादन योग्य कोड में संकलित किया जाएगा।

कुछ के साथ गलत:

#ifdef ... 
printf("Hello"); 
#endif 

क्योंकि यह सब आप जहाँ तक preprocessors जाना के रूप में कर सकते हैं।

+5

यह संकलन-समय पर प्रिंट नहीं करेगा, जो मैं सोच रहा हूं कि ओपी तलाश रहा है। –

+0

मुझे लगता है कि वह रन-टाइम पर प्रिंटिंग का मतलब था। –

+1

मैं संकलन समय के बारे में पूछ रहा था। धन्यवाद! –

10

आप चाहते हो सकता है की कोशिश करने के लिए: #pragma message("Hello World!")

40

निम्न द्वारा समर्थित हैं MSVC, और GCC

#pragma message("stuff") 
#pragma message "stuff" 

क्लैंग ने हाल ही में समर्थन जोड़ने शुरू कर दिया है, और अधिक के लिए here देखें।

+0

बस रिकॉर्ड के लिए, सोलारिस स्टूडियो 12.3 (सन सी 5.12) इस प्राग का समर्थन नहीं करता है। – maxschlepzig

7

सबसे सी compilers एक #warning निर्देश पहचान लेंगे, तो

#warning "Got here" 

वहाँ भी मानक '#Error' निर्देश है,

#error "Got here" 

जबकि सभी compilers का समर्थन, यह भी बंद कर देंगे संकलन/पूर्व प्रसंस्करण।

5
#pragma message("foo") 

अच्छा काम करता है। यदि आप उपयोग करते हैं तो भी संकलन को रोक नहीं पाएंगे- वाइर

-1

एक और समाधान टिप्पणियों का उपयोग करना और उन्हें संसाधित करने के लिए एक खोल स्क्रिप्ट का उपयोग करना है। यह कुछ अनुशासन (या एक शेल स्क्रिप्ट जो टाइपो पकड़ता है) लेता है।

उदाहरण के लिए, मैं //TODO स्वरूपित टिप्पणियां जोड़ता हूं और फिर एक शेल स्क्रिप्ट जो उन सभी को एक रिपोर्ट में एकत्र करता है।

अधिक जटिल उपयोग मामलों के लिए, आप अपना खुद का सरल प्रीप्रोसेसर लिखने का प्रयास कर सकते हैं। उदाहरण के लिए, आप अपने स्रोतों को *.c2 फ़ाइलों के रूप में संपादित कर सकते हैं। सरल प्रीप्रोसेसर स्रोत पढ़ेगा, //TODO देखें, और आउटपुट *.c फ़ाइल में printf("TODO ...") लिखें।

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

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