2010-10-19 23 views
8

की प्राथमिकता यदि मेरे पास सी फ़ाइल foo.c है और मैंने संकलन के लिए कमांड लाइन विकल्प के रूप में -DMACRO=1 दिया है। हालांकि, अगर हेडर फ़ाइल में भी मेरे पास-D मैक्रो और #define मैक्रो

#define MACRO 2 

इनमें से कौन सा प्राथमिकता प्राप्त होगी?

+8

जब आपने कोशिश की तो क्या हुआ? –

उत्तर

1

मैनुअल का कहना है: पहले सब-डी और यू (खंड डी के तहत) के क्रम में मूल्यांकन किया जाता है और फिर सब -Includes

सबसे अच्छा तरीका है: इसे बाहर का प्रयास करें।

4

संकलक उन्हें संकलित करने के क्रम में संग्रहीत किए जाते हैं, और जब संकलक एक ही नाम के साथ एक नया मैक्रो मुठभेड़ करता है, तो यह पिछले मैक्रो को नए के साथ ओवरराइट करता है (कम से कम यह जीसीसी में मामला है)। जब ऐसा होता है तो जीसीसी आपको चेतावनी भी देगा।

4

आपको मैक्रो पुनर्वितरण के लिए एक त्रुटि मिलेगी। जाहिर है -D पहले परिभाषित हो जाता है (स्रोत फ़ाइल को बाद में पार्स किया गया है) या इसका कोई उपयोग नहीं होगा। #define फिर एक पुनर्वितरण है।

7

कमांड लाइन विकल्प फ़ाइल से पढ़ने वाली किसी भी पंक्ति से आगे लागू होते हैं। फ़ाइल सामग्री लिखित क्रम में लागू होती है। सामान्य रूप से, यदि कमांड लाइन शामिल है या नहीं, इस पर ध्यान दिए बिना, यदि कोई मैक्रो फिर से परिभाषित किया गया है तो आपको कम से कम एक चेतावनी मिलेगी। चेतावनी को शांत किया जा सकता है यदि पुनर्वितरण कोई फर्क नहीं पड़ता, शायद इसलिए कि दोनों परिभाषाएं समान हैं।

इस तरह के एक प्रश्न का उत्तर देने का सही तरीका एक छोटा परीक्षण केस बनाना और इसे आजमा देना है।

#define AAA 2 
AAA 

और सी पूर्वप्रक्रमक के माध्यम से इसे चलाने, शायद gcc -E साथ:

 
C:>gcc -DAAA=42 -E q3965956.c 
# 1 "q3965956.c" 
# 1 "" 
# 1 "" 
# 1 "q3965956.c" 
q3965956.c:1:1: warning: "AAA" redefined 
:1:1: warning: this is the location of the previous definition 

2 

C:> 

आप उत्पादन से देख सकते हैं कि मैक्रो मान करने के लिए विस्तारित उदाहरण के लिए, q3965956.c में निम्नलिखित डाल फ़ाइल में #define द्वारा दिया गया। इसके अलावा, आप # निर्देशों के अनुक्रम से देख सकते हैं कि अंतर्निहित परिभाषाएं और कमांड लाइन दोनों q3965956.c की पंक्ति 1 की किसी भी सामग्री से पहले संसाधित की गई थीं।

5

मैं आप क्या कर रहे की एक धारणा बना रही हूँ, लेकिन आप कमांड लाइन से, कि मैक्रो के लिए एक गैर-सामान्य मान आपूर्ति मैक्रो परिभाषा के लिए यह कोशिश करना चाहते हैं तो:

#ifndef MACRO 
#define MACRO 2 
#endif 

इस तरह यदि मैक्रो पहले ही परिभाषित किया गया है (कमांड लाइन पैरामीटर के माध्यम से) इसे न तो फिर से परिभाषित किया जाएगा और न ही एक त्रुटि होगी।

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