2012-03-14 8 views
22

में संकलन समय पर #define का मूल्य कैसे दिखाने के अब तक मैं जहाँ तक मिल गया है है:मैं जीसीसी

#define ADEFINE "23" 
#pragma message ("ADEFINE" ADEFINE) 

कौन सा काम करता है, लेकिन क्या हुआ अगर ADEFINE एक स्ट्रिंग नहीं है?

#define ADEFINE 23 
#pragma message ("ADEFINE" ADEFINE) 

कारणों:

चेतावनी: विकृत '#pragma संदेश',

नजरअंदाज कर दिया आदर्श रूप में मैं अपरिभाषित सहित किसी भी मूल्य, से निपटने के लिए सक्षम होने के लिए करना चाहते हैं।

उत्तर

22

मैक्रो जो तार नहीं कर रहे हैं दिखाने के लिए, stringify the macro:

#define STRINGIFY(s) XSTRINGIFY(s) 
#define XSTRINGIFY(s) #s 

#define ADEFINE 23 
#pragma message ("ADEFINE=" STRINGIFY(ADEFINE)) 

यदि आपके पास boost है, तो आप इसे करने के लिए boost stringize का उपयोग कर सकते हैं:

#include <boost/preprocessor/stringize.hpp> 
#define ADEFINE 23 
#pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE)) 
+0

ठीक है, मुझे नहीं लगता कि मेरा ग्राहक निर्भरता के रूप में जोड़े जाने के लिए बहुत खुश होगा, लेकिन यह अस्तित्व प्रमाण की तरह दिखता है। शायद मुझे जाना चाहिए और stringize.hpp –

+4

@JohnLawrenceAspden मैंने देखा है कि बिना किसी बढ़ावा के (या किसी अन्य लाइब्रेरी) के बिना इसे कैसे अपडेट किया जाए। – rob05c

6

मुझे यकीन नहीं है कि यह वही करेगा जो आप चाहते हैं, लेकिन यदि आप कभी-कभी कभी-कभी मैक्रो समस्या को डीबग करने में रुचि रखते हैं (इसलिए यह कुछ ऐसा नहीं है जिसे आपको प्रत्येक संकलन के लिए संदेश में प्रदर्शित करने की आवश्यकता है), निम्न आपके लिए काम कर सकता है प्रीप्रोसेसिंग आउटपुट के साथ #define निर्देशों को डंप करने के लिए जीसीसी के -E -dD विकल्प का उपयोग करें। फिर पाइप कि grep के माध्यम से ही लाइनों को देखने के आप चाहते हैं:

// test.c 
#include <stdlib.h> 
#include <stdio.h> 
#define ADEFINE "23" 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
#undef ADEFINE 
#define ADEFINE 42 
    return 0; 
} 

आदेश gcc -E -dD -c test.c | grep ADEFINE शो:

#define ADEFINE "23" 
#undef ADEFINE 
#define ADEFINE 42