2009-07-22 22 views
7

का मुद्रण नाम और मान मेरे पास एक सी प्रोग्राम है जिसमें कई अनुकूलन हैं जिन्हें #define एस के साथ सक्षम या अक्षम किया जा सकता है। जब मैं अपना प्रोग्राम चलाता हूं, तो मैं जानना चाहता हूं कि संकलन समय पर मैक्रोज़ को परिभाषित किया गया है।एक मैक्रो

तो मै मैक्रो के वास्तविक मूल्य को मुद्रित करने के लिए मैक्रो फ़ंक्शन लिखने की कोशिश कर रहा हूं। कुछ इस तरह:

SHOW_DEFINE(X){\ 
    if(IS_DEFINED(X))\ 
     printf("%s is defined and as the value %d\n", #X, (int)X);\ 
    else\ 
     printf("%s is not defined\n", #X);\ 
} 

हालांकि मैं यह काम करने के लिए पता नहीं कैसे और मुझे लगता है यह संभव नहीं है, किसी को भी यह कैसे करना है की एक विचार है करता है?

(ध्यान दें कि यह तब भी जब मैक्रो परिभाषित नहीं है संकलन चाहिए!)

उत्तर

4

एक मैक्रो लिखना जो किसी अन्य मैक्रो को फैलाता है, उसे प्रीप्रोसेसर को दो बार चलाने की आवश्यकता होगी।
ऐसा नहीं किया गया है।

आप एक सरल फ़ाइल लिख सकता है,

// File check-defines.c 
int printCompileTimeDefines() 
{ 
#ifdef DEF1 
    printf ("defined : DEF1\n"); 
#else // DEF1 
    printf ("undefined: DEF1\n"); 
#endif // DEF1 
// and so on... 
} 

एक ही संकलन समय अन्य फाइलों के साथ के रूप में इस फाइल पर लाइनों को परिभाषित का प्रयोग करें।
शुरुआत में कुछ समय समारोह को कॉल करें।

आप के बजाय एक स्रोत फ़ाइल के अंदर #DEFINE लाइनों Makefile है, तो
उन्हें किसी अन्य Header फाइल करने के लिए ले जाएँ और सभी स्रोत फ़ाइलों में है कि शीर्ष लेख, इस check-defines.c सहित
शामिल ।

उम्मीद है कि आपके पास अपनी सभी स्रोत फ़ाइलों में परिभाषित परिभाषा का एक ही सेट है।
अन्यथा, यह आपकी परिभाषा की रणनीति को फिर से जांचना समझदार होगा। इस समारोह की


करने के लिए स्वचालित पीढ़ी,
आप M4 मैक्रो भाषा (या यहां तक ​​कि एक AWK script वास्तव में) इस्तेमाल कर सकते हैं।
एम 4 आपका प्री-प्री-प्रोसेसर बन जाता है।

+0

एम 4 उत्तर के लिए स्वीकृत। जब आप एक और प्रीप्रोकैसिंग चरण जोड़ते हैं तो यह आसान हो जाता है। मैंने SHOW_DEFINE (एक्स, वाई, जेड ...) किया जो भी बेहतर है। हालांकि यह समझ में आता है क्योंकि मुझे अन्य सामानों के लिए एम 4 की आवश्यकता है। – Ben

2
#ifdef MYMACRO 
    printf("MYMACRO defined: %d\r\n", MYMACRO); 
#endif 

मुझे नहीं लगता कि आप क्या करने की कोशिश कर रहे हैं करना संभव है। आप रनटाइम पर जानकारी मांग रहे हैं जिसे संकलन से पहले संसाधित किया गया है। स्ट्रिंग "MYMACRO" का अर्थ है सीपीपी ने इसे आपके प्रोग्राम के अंदर अपने मूल्य में विस्तारित करने के बाद कुछ भी नहीं किया है।

+0

अच्छी तरह से, मैं यही टालना चाहूंगा, क्योंकि उनमें से कई #ifdef #else #endif के साथ हैं। – Ben

2

आपने जिस कंपाइलर का उपयोग कर रहे थे उसे निर्दिष्ट नहीं किया था। यदि यह जीसीसी है, gcc -E आपकी मदद कर सकता है, क्योंकि यह प्रीप्रोकैसिंग चरण के बाद बंद हो जाता है, और प्रीप्रोकैसिंग परिणाम प्रिंट करता है। यदि आप मूल फ़ाइल के साथ एक gcc -E परिणाम भिन्न करते हैं, तो आप जो चाहते हैं उसका हिस्सा प्राप्त कर सकते हैं।

2

प्रीप्रोसेसर के साथ इसका परीक्षण क्यों न करें?

#if defined(X) 
     printf("%s is defined and as the value %d\n", #X, (int)X); 
#else 
     printf("%s is not defined\n", #X); 
#endif 

एक भी एक और परीक्षण में इस एम्बेड यह हर मुद्रित करने के लिए नहीं कर सकते हैं:

#if define(SHOW_DEFINE) 
#if defined(X) 
     printf("%s is defined and as the value %d\n", #X, (int)X); 
#else 
     printf("%s is not defined\n", #X); 
#endif 
#endif 
+0

@ फिलिप, ठीक है, यही है कि मैं और kjfletch सुझाव दिया है। लेकिन वह उन सभी को लिखने से बचना चाहता है, यही कारण है कि मैं एम 4 या एडब्ल्यूके स्क्रिप्टिंग का सुझाव देता हूं। – nik

+0

यह वही है जो मैं अब करता हूं, सूची कभी अद्यतित नहीं होती है और इसे केवल इस उद्देश्य के लिए एक विशेष फ़ाइल की आवश्यकता होती है :( – Ben

1

Wave library बढ़ावा से भी सहायक आप क्या चाहते हैं क्या करने के लिए हो सकता है।यदि आपकी परियोजना काफी बड़ी है, तो मुझे लगता है कि यह कोशिश करने लायक है। यह एक सी ++ प्रीप्रोसेसर है, लेकिन वे वही हैं :)

1

मुझे विश्वास है कि आप जो करने की कोशिश कर रहे हैं वह संभव नहीं है। आप जिस तरह से अपने #define काम को बदलने में सक्षम हैं, तो मैं कुछ इस तरह का सुझाव:

#define ON 1 
#define OFF 2 

#define OPTIMIZE_FOO ON 
#define OPTIMIZE_BAR OFF 

#define SHOW_DEFINE(val)\ 
    if(val == ON) printf(#val" is ON\n");\ 
    else printf(#val" is OFF\n"); 
1

यह संभव वास्तव में, नहीं है समस्या "परिभाषित नहीं" हिस्सा है। जब तक आप इस तथ्य के साथ प्रस्तुत करने को तैयार हैं कि SOMESTRING = SOMESTRING इंगित करता है कि SOMESTRING

#define SHOW_DEFINE(X) \ 
do { \ 
if (X > 0) \ 
    printf("%s %d\n", #X, (int)X); \ 
else \ 
    printf("%s not defined\n", #X); \ 
} while(0) 
25

: आप मैक्रो मूल्यों पर भरोसा चाहते हैं, तो सक्रिय करने के लिए/अपने कोड के कुछ हिस्सों निष्क्रिय करें, फिर आप बस कर सकता है (!?! यह देखने के रूप में टोकन नए सिरे से परिभाषित नहीं किया गया है) परिभाषित नहीं किया गया, तो निम्न करना चाहिए:

#include <stdio.h> 

#define STR(x) #x 
#define SHOW_DEFINE(x) printf("%s=%s\n", #x, STR(x)) 

#define CHARLIE -6 
#define FRED 1 
#define HARRY FRED 
#define NORBERT ON_HOLIDAY 
#define WALLY 

int main() 
{ 
    SHOW_DEFINE(BERT); 
    SHOW_DEFINE(CHARLIE); 
    SHOW_DEFINE(FRED); 
    SHOW_DEFINE(HARRY); 
    SHOW_DEFINE(NORBERT); 
    SHOW_DEFINE(WALLY); 

return 0; 
} 

उत्पादन होता है:

BERT=BERT 
CHARLIE=-6 
FRED=1 
HARRY=1 
NORBERT=ON_HOLIDAY 
WALLY= 
+1

अच्छा! – Ben

+0

और मुझे बस 15 वर्ण टिप्पणी सीमा को बाईपास करने का एक तरीका मिला .. – Ben

0

Chrisharris के आधार पर, इस सवाल का जवाब मैंने किया इस। हालांकि मेरा जवाब बहुत अच्छा नहीं है, यह वही है जो मैं चाहता था।

#define STR(x) #x 
#define SHOW_DEFINE(x) printf("%s %s\n", #x, strcmp(STR(x),#x)!=0?"is defined":"is NOT defined") 

केवल बग मुझे मिला है कि परिभाषा # XXX XXX (XXX के साथ XXX के बराबर) नहीं होनी चाहिए।

0

आप 1.पर प्रारंभ किए गए एक पूर्णांक चर का उपयोग कर सकते हैं # इस चर के साथ परिभाषित करें और चर के मान मुद्रित करें।