2010-04-11 23 views
13

के लिए "प्रकाश" प्रीप्रोसेसर चलाएं GCC प्रीप्रोसेसर चलाने के लिए कोई तरीका है, लेकिन केवल उपयोगकर्ता द्वारा परिभाषित मैक्रोज़ के लिए?जीसीसी

मेरे पास कुछ एक-लाइनर हैं और कुछ #ifdef, आदि सशर्त हैं, और मैं देखना चाहता हूं कि मेरे कोड का विस्तार होने पर मेरा कोड कैसा दिखता है।

यह है के रूप में, विस्तारित किए जाते हैं शामिल हैं, fprintf(((__getreeent())->_stderr) में मेरी fprintf(stderr) रों बारी, आदि

उत्तर

14

कॉल cpp सीधे, उदा

$ cat >foo.c <<EOF 
#define FOO 
#ifdef FOO 
foo is defined 
#else 
foo is not defined 
#endif 
EOF 

$ cpp foo.c 
# 1 "foo.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "foo.c" 


foo is defined 

बेशक, यदि आप कोई शीर्षलेख शामिल करते हैं तो उन्हें आउटपुट में शामिल किया जाएगा। इससे बचने का एक तरीका grep -v#include एस के साथ लाइनों (या शायद #include < के साथ केवल #include ") की अनुमति दे सकता है। या आप मानक को हटाने के लिए -nostdinc विकल्प निर्दिष्ट कर सकते हैं (लेकिन संभावित रूप से स्थानीय पुस्तकालयों में छोड़ दें जब तक कि आप पथ शामिल नहीं करते हैं ताकि वे पाए जाएंगे) - यह अनुपस्थित हेडर के बारे में चेतावनी देगा।

संपादित करें: या हेडर को सशर्त बनाने के लिए प्रीप्रोसेसर का उपयोग करें, उन्हें #ifndef TESTING_PREPROCESSOR जैसे कुछ में लपेटें और -DTESTING_PREPROCESSOR का उपयोग करें।

+2

+1 को हटाने - एक '# अनुभाग if' में' # include' लाइनों डालने के लिए टिप उन सरल अभी तक प्रभावी चीजों में से एक यह है कि किसी अन्य व्यक्ति के साथ तब तक नहीं हो सकता जब तक कि अन्य प्रयासों का एक समूह अन्य जटिल चीजों की कोशिश नहीं कर रहा था। –

1
gcc -E inputfile.c > outputfile.c 

outputfile.c अपने preprocessed कोड होगा, लेकिन सभी मैक्रो विस्तार किया जाएगा।

मुझे यह चाल बहुत उपयोगी है जब बड़ी प्रणालियों के संकलन को डिबग करने में बहुत सारे शामिल हैं, जिनमें कंपाइलर झंडे और मेकफ़ाइल चर शामिल हैं। इसमें उन फ़ाइलों को शामिल किया जाएगा जिनमें हेडर गार्ड नहीं हैं, और अन्य समस्याओं का भी एक समूह है।

+1

क्या यह प्रीप्रोसेसर चलाने का मानक तरीका नहीं है? यह सवाल का जवाब कैसे देता है? संभवतः ओपी एक गैर-मानक व्यवहार (?) चाहता है। –

+0

यह मानक तरीका है। यदि आपका प्रोग्राम उपयोगकर्ता द्वारा परिभाषित मैक्रोज़ पर भारी है, और गैर-उपयोगकर्ता-परिभाषित मैक्रोज़ पर प्रकाश है, तो उपयोगकर्ता द्वारा परिभाषित मैक्रोज़ स्पॉट करना आसान होगा। inputfile.c और outputfile.c का एक diff चलाकर। कई मामलों में, जीसीसी-ई पर्याप्त है, हालांकि निश्चित रूप से "केवल" उपयोगकर्ता परिभाषित मैक्रोज़ का पता लगाने में बिल्कुल सही है। और यह अन्य उत्तरों में वर्णित सही विधियों का उपयोग करने से बहुत तेज़ है। –

2

एक, unifdefall unifdef जैसे उपकरणों का उपयोग कर सकते हैं - कोड

से पूर्वप्रक्रमक सशर्त,