2009-12-06 21 views
8

मुझे उत्सुकता है कि मैं इस तरह प्रारूपित लगभग सभी सी मैक्रोज़ क्यों देखता हूं:सी मैक्रो/# इंडेंटेशन परिभाषित?

#ifndef FOO 
# define FOO 
#endif 

या यह:

#ifndef FOO 
#define FOO 
#endif 

लेकिन यह कभी नहीं:

#ifndef FOO 
    #define FOO 
#endif 

(इसके अलावा, vim = ऑपरेटर केवल पहले दो को सही मानता है।)

क्या यह कंपेलरों के बीच पोर्टेबिलिटी मुद्दों के कारण है, या यह सिर्फ एक मानक अभ्यास है?

उत्तर

4

आईआईआरसी, पुराने सी प्रीप्रोसेसरों को # लाइन पर पहला अक्षर होना आवश्यक था (हालांकि मुझे वास्तव में कभी आवश्यकता नहीं थी जिसकी आवश्यकता थी)।

मैंने आपके कोड को आपके पहले उदाहरण की तरह कभी नहीं देखा। मैंने आमतौर पर आपके दूसरे उदाहरण के रूप में प्रीप्रोसेसर निर्देश लिखा था। मैंने पाया कि यह वास्तविक कोड के इंडेंटेशन के साथ दृष्टि से हस्तक्षेप करता है (नहीं कि मैं अब सी में लिखता हूं)।

GNU C Preprocessor manual का कहना है:

Preprocessing निर्देशों अपने कार्यक्रम में लाइनों का वह '#' के साथ शुरू कर रहे हैं। व्हाइटस्पेस से पहले और बाद में '#' की अनुमति है।

+0

और अतिरिक्त जलन (जैसे प्रश्न में उल्लिखित ओपी की तरह) है कि संपादकों के पास अक्सर अपना विचार होता है कि प्रीप्रोसेसर सशर्त ब्लॉक कैसे होना चाहिए (या नहीं)। –

+1

पुराना वैक्स सी कंपाइलर (लगभग 1 9 86) एक त्रुटि फेंक देगा अगर प्रीप्रोसेसर निर्देश में पहले कॉलम में '#' नहीं था। –

7

मैं यह सब तीन तरीकों से किया जाता है, यह शैली की बात,

जबकि आम तौर पर दूसरे उदाहरण सबसे आम है, मैं देखा है मामलों वाक्य रचना की नहीं जहां पहले हो रहा है देखा है (या तीसरा) #ifdefs के एकाधिक स्तरों को अलग करने में मदद के लिए प्रयोग किया जाता है। कभी-कभी तर्क गहराई से घोंसला हो सकता है और इसे एक नज़र में समझने का एकमात्र तरीका इंडेंटेशन का उपयोग करना है जैसे कि {और} के बीच कोड के ब्लॉक को इंडेंट करना आम बात है।

1

प्रीप्रोसेसर निर्देश हमारे कार्यक्रमों में शामिल लाइनें हैं जो वास्तव में कार्यक्रम विवरण नहीं हैं बल्कि प्रीप्रोसेसर के लिए निर्देश हैं। ये रेखाएं हमेशा हैश चिह्न (#) से पहले होती हैं। व्हाइटस्पेस को '#' से पहले और बाद में अनुमति दी जाती है। जैसे ही एक न्यूलाइन चरित्र मिलता है, प्रीप्रोसेसर निर्देश को समाप्त माना जाता है।

सी/सी ++ के मानक के लिए अब तक कोई अन्य नियम नहीं है, इसलिए यह शैली और पठनीयता समस्या के मामले के रूप में बनी हुई है, मैंने केवल आपके द्वारा पोस्ट किए गए दूसरे तरीके से कार्यक्रमों को देखा/लिखा है, हालांकि तीसरा अधिक पठनीय लगता है।

3

वरीयता के लिए मैं तीसरे शैली का उपयोग करता हूं, जिसमें गार्ड शामिल करने के अपवाद के साथ, जिसके लिए मैं दूसरी शैली का उपयोग करता हूं। एक पूर्वप्रक्रमक निर्देश होने के रूप में मैं #define के बारे में सोच है, भले ही वास्तव में निश्चित रूप से यह नहीं है, यह एक # पूर्वप्रक्रमक निर्देश define द्वारा पीछा किया है -

मैं पहली शैली पसंद नहीं है। लेकिन चूंकि मैं इस तरह से सोचता हूं, इसलिए उन्हें अलग करना गलत लगता है। मैं उम्मीद करता हूं कि उन लोगों द्वारा लिखे गए पाठ संपादकों की सलाह है कि उस शैली में एक ब्लॉक इंडेंट/अन इंडेंट होगा जो उस शैली में लिखे गए कोड पर काम करता है। लेकिन मुझे एक टेक्स्ट एडिटर का उपयोग करके इसका सामना करना पड़ेगा जो नहीं था।

प्राचीन प्रीप्रोसेसरों को घूमने का कोई मतलब नहीं है, जहां # लाइन का पहला अक्षर होना चाहिए, जब तक कि आप उन सभी कार्यान्वयन और मानक सी के बीच अन्य सभी मतभेदों को अपने सिर के शीर्ष पर भी सूचीबद्ध न कर सकें, ताकि बचने के लिए अन्य चीजें जो आप संभवतः कर सकते हैं कि वे समर्थन नहीं करेंगे। बेशक यदि आप वास्तव में एक पूर्व-मानक कंपाइलर के साथ काम कर रहे हैं, तो काफी उचित है।

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