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


99

मैं ऐसा कुछ करने में सक्षम होना चाहूंगा

#print "C Preprocessor got here!"

डिबगिंग उद्देश्यों के लिए। ऐसा करने का सबसे अच्छा / सबसे पोर्टेबल तरीका क्या है?

जवाबों:


115

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

#warning "C Preprocessor got here!"

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

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

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

11
@ ब्रायन: हाँ। #define WARNING(msg) _Pragma("message " #msg)
मैट जॉइनर

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

6
चेतावनी जारी करना बहुत असुविधाजनक है जब आपका प्रोजेक्ट डिफ़ॉल्ट रूप से -Wall के साथ संकलित करता है। #pragma संदेश में वह समस्या नहीं है।
बजे रेनन जिग्नानी

56

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

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

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


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

Visual Studio vMicro का उपयोग करके Arduino 1.8 के साथ काम करता है। धन्यवाद!
save_Jff


9

अधिकांश सी कंपाइलर एक #warningनिर्देश को पहचानेंगे , इसलिए

 #warning "Got here"

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

 #error "Got here"

जबकि सभी संकलक समर्थन करते हैं, यह संकलन / प्रीप्रोसेसिंग को भी रोक देगा।


6
#pragma message("foo")

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


0

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

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

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


-17

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

कुछ भी गलत:

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

क्योंकि यह सब आप कर सकते हैं जहां तक ​​प्रीप्रोसेसर चलते हैं।


5
यह संकलन-समय पर प्रिंट नहीं होगा, जो कि मैं सोच रहा हूं कि ओपी खोज रहा है।
बॉब कॉफमैन

मैंने मान लिया कि उनका मतलब रन-टाइम पर प्रिंटिंग है।
अलेक्जेंडर रैफरटी

1
मैं संकलन-समय के बारे में पूछ रहा था। धन्यवाद!
एंड्रयू वैगनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.