2012-05-09 12 views
9

मैं कुछ हद तक #define बयान से उलझन में हूं। पुस्तकालयों में, वे #ifdef एस और #ifndef एस के साथ विभिन्न फ़ाइलों में संचार का साधन प्रतीत होते हैं।सी: #define निर्देश वैश्विक हैं?

करने के बाद कहा कि अब मैं file1.c और file2.cfile2.c अंदर एक साथ संकलित, #define TEST 10 साथ दो फ़ाइलों है,।

'TEST' undeclared (first use in this function) 

#define निर्देशों वैश्विक हैं: फिर भी, जब मैं TESTfile2.c अंदर का उपयोग संकलक निम्न त्रुटि संदेश देता है?

+0

यह निर्भर करता है कि उन्हें कहां परिभाषित किया गया है। – Nick

+0

'परिभाषित 'एक प्रीप्रोसेसर निर्देश है - यह संकलन समय पर सरल पाठ प्रतिस्थापन बनाता है - केवल संकलन इकाई और किसी भी' # शामिल 'डीडी फाइलें * एक' # परिभाषित 'देखेंगी। –

उत्तर

13

#define नहीं वैश्विक, वे सिर्फ एक प्रतिस्थापन जहां कभी वे उपयोग किया जाता है (अगर एक ही संकलन इकाई में घोषित)

हैं वे वैश्विक नहीं हैं, वे नहीं प्रतीक हैं हैं, वे हैं लिंक पर अप्रासंगिक, वे केवल प्री-संकलन पर प्रासंगिक हैं।

+0

"संकलन इकाई" से आपका क्या मतलब है? एक ही संकलन इकाई में मेरे पास 'file1.c' और' file.2' कैसे हो सकता है? – Randomblue

+1

नहीं। वे अलग से संकलित हैं। और मुर्गी एक साथ जुड़े हुए हैं। क्या आप सी निर्माण प्रक्रिया से परिचित हैं? – MByD

+0

तो 'file1.c' और' file2.c' एक ही संकलन इकाई में कभी नहीं हो सकता है? – Randomblue

4

#define डी मैक्रोज़ वैश्विक हैं कि वे सामान्य सी स्कॉइंग नियमों का पालन नहीं करते हैं। मैक्रो से पाठ प्रतिस्थापन लागू किया जाएगा (लगभग) कहीं भी मैक्रो नाम #define के बाद प्रकट होता है। (उल्लेखनीय अपवाद हैं यदि मैक्रो नाम किसी टिप्पणी या स्ट्रिंग अक्षर का हिस्सा है।)

यदि आप हेडर फ़ाइल में मैक्रो को परिभाषित करते हैं, तो #include की कोई भी फ़ाइल जो हेडर फ़ाइल उस मैक्रो का वारिस करेगी (चाहे वे इसे चाहते हैं या नहीं), जब तक वे स्पष्ट रूप से #undef के साथ इसे परिभाषित नहीं करते हैं।

आपके उदाहरण में, file2.cTEST मैक्रो के बारे में नहीं जानता है। file1.c से #define को चुनना कैसे होगा? जादू से? चूंकि मैक्रोज़ स्रोत कोड पर टेक्स्ट प्रतिस्थापन करते हैं, इसलिए उत्पन्न ऑब्जेक्ट फ़ाइलों में उनका कोई प्रतिनिधित्व नहीं होता है। file2.c इसलिए यह पता होना चाहिए कि प्रतिस्थापन नियम स्वयं ही है, और यदि आप चाहते हैं कि कई फाइलों में साझा किया जाए, तो #define को एक सामान्य शीर्षलेख फ़ाइल में रहने की आवश्यकता है जो आपकी .c फ़ाइलें #include है।

आप के बारे में विशेष रूप से पूछ रहे हैं कि कैसे #ifdef कि आप देख में पुस्तकालयों काम करते हैं, उनमें से कई की संभावना पूर्व निर्धारित मैक्रो संकलन वातावरण द्वारा प्रदान नामों के खिलाफ जाँच कर रहे हैं के कई। उदाहरण के लिए, एक सी 99 कंपाइलर __STDC_VERSION__ मैक्रो परिभाषित करता है जो भाषा संस्करण निर्दिष्ट करता है; एक माइक्रोसॉफ्ट कंपाइलर _MSC_VER मैक्रो परिभाषित करता है। अधिकांश कंपाइलर सरल मैक्रोज़ को कमांड लाइन तर्क के रूप में परिभाषित करने की अनुमति भी देते हैं। उदाहरण के लिए, एस को अक्षम करने के लिए परिभाषित NDEBUG के साथ file.c संकलित करने के लिए आप gcc -DNDEBUG file1.c के माध्यम से अपना कोड संकलित कर सकते हैं।

+0

Thx – Hydro

1

आपको फ़ाइल 1.h बनाना चाहिए और वहां अपनी परिभाषा डालना चाहिए। फिर फ़ाइल 2 में।ग

#include "file1.h" 

एक पाई :)

0

मामले किसी में बाद में इस पढ़ता है, और कुछ व्यावहारिक जानकारी जोड़ने के लिए उतना आसान:

  • atmel जैसे कुछ वातावरण, बनाम, या IAR, आप की अनुमति देते हैं वैश्विक # परिभाषा निर्देशों को परिभाषित करने के लिए। वे मूल रूप से इन परिभाषित मानों को कुछ कमांडलाइन प्रारूप में प्रीकंपलर को पास करते हैं।
  • आप बैच कमांड या मेकफ़ाइल आदि में ऐसा कर सकते हैं।
  • Arduino हमेशा सभी संकलनों के लिए एक बोर्ड संस्करण (हार्डवेयर \ arduino \ variants पर स्थित) जोड़ता है। उस समय आप एक नया बोर्ड बना सकते हैं जिसमें आपके वैश्विक परिभाषा निर्देश शामिल हों, और इस तरह इसका उपयोग करें। उदाहरण के लिए, आप मूल मेगा 2560 में मेगा 2560 (डीबग) बोर्ड को परिभाषित कर सकते हैं जिसमें कुछ डीबग निर्देश शामिल हैं। आप कुछ पाठ चिपकाने और इसे ठीक से संशोधित करके, "boards.txt" में उस संस्करण का संदर्भ जोड़ देंगे।

दिन के अंत में, आपको उस वैश्विक हाइफ़ाइल या संकलक को वैश्विक तरीके से एक या दूसरे तरीके से वैश्विक निर्देश देना होगा।

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