C / C ++ प्रीप्रोसेसर में अपनी लाइन पर एक एकल पाउंड / हैश साइन (#) का उद्देश्य क्या है?


145

मैं बूस्ट पुस्तकालयों स्रोत कोड को देख रहा हूं, और मैंने देखा है कि अक्सर बिना किसी पूर्वप्रक्रमक निर्देशों के एकल पाउंड संकेत होते हैं। मैं जीसीसी प्रीप्रोसेसर मैनुअल और विनिर्देश गाइड के माध्यम से पढ़ा और इसके बारे में कुछ भी नहीं पा सकता हूं।

(1) #ifndef BOOST_CONFIG_HPP
(2) #  include <boost/config.hpp>
(3) #endif
(4) #
(5) #if defined(BOOST_HAS_PRAGMA_ONCE)
(6) #  pragma once
(7) #endif

लाइन 4 पर, पाउंड साइन के बाद कुछ भी नहीं है। इसका क्या प्रभाव पड़ता है? क्या इसे C प्रीप्रोसेसर (CPP) विनिर्देश में परिभाषित किया गया है?

जैसा कि बूस्ट एक क्रॉस-प्लेटफॉर्म लाइब्रेरी है, मैं मानूंगा कि किसी भी सीपीपी को इसे सही तरीके से पार्स करना चाहिए। कोड भर में यादृच्छिक पाउंड / हैश संकेत होने का क्या प्रभाव / दुष्प्रभाव होगा?


6
@ ज़ैबिस एग। जीसीसी सुइट में प्रीप्रोसेसर का निष्पादन योग्य नाम "सीपीपी" है (जबकि संकलक जीसीसी और जी ++ हैं)
deviantfan

3
सीपीपी का मतलब सी-प्लस-प्लस है।
djidot

6
पूरी तरह से नहीं। En.wikipedia.org/wiki/C_preprocessor
P45 Imminent

7
@djeidot "cpp" अस्पष्ट है। यही कारण है कि लोग सी-प्लस-प्लस का उल्लेख करते समय "c ++", या "cxx" (x जैसा दिखता है + 45 डिग्री) का उपयोग करते हैं।
माइक Ounsworth

12
@djeidot नहीं, CPP C-PreProcessor है। यह C ++ से पहले भी अस्तित्व में था।
Leandros

जवाबों:


185

एक #लाइन पर अपने आप पर कोई प्रभाव नहीं पड़ता है। मुझे लगता है कि यह सौंदर्य मूल्य के लिए इस्तेमाल किया जा रहा है।

C मानक कहता है:

6.10.7 अशक्त निर्देश

शब्दार्थ

प्रपत्र का एक पूर्वप्रक्रमक निर्देश

# new-line

कोई प्रभाव नहीं है।

C ++ मानक एक ही बात कहता है:

16.7 अशक्त निर्देश [cpp.null]

प्रपत्र का एक पूर्वप्रक्रमक निर्देश

# new-line

कोई प्रभाव नहीं है।


4
यह इसका उपयोग करने के उद्देश्य की व्याख्या नहीं करता है, हालांकि, न ही इसके अस्तित्व के लिए तर्क देता है।
स्टेलारवर्टेक्स

8
"इसका क्या प्रभाव होता है? क्या यह C प्रीप्रोसेसर (CPP) विनिर्देशन में परिभाषित किया गया है? ... कोड भर में यादृच्छिक पाउंड / हैश संकेत होने का क्या प्रभाव / दुष्प्रभाव होगा?" यही मैंने उत्तर दिया। इसका कोई प्रभाव नहीं है, लेकिन मैं इसे इस्तेमाल करने के लेखक के कारण पर अटकलें नहीं लगाना चाहता था। मैंने अब किया है।
जोनाथन वॉकली

आपको सही उत्तर दिए गए हैं कि इसका मतलब प्रीप्रोसेसर के लिए कुछ भी नहीं है; मैं अनुमान लगाने जा रहा हूं कि यह कुछ अन्य प्रोग्राम (जैसे आईडीई या एलआईटी) को एक तार्किक इकाई के रूप में निर्देशों का एक ब्लॉक रखने में मदद कर सकता है। कुछ आईडीई प्रोग्रामर को फाइल के लॉजिकल स्ट्रक्चर का ट्रैक रखने में मदद करने के लिए टेक्स्ट के ब्लॉक का विस्तार या पतन करते हैं।
स्पेंसर

107

यह स्रोत कोड को सुंदर बनाता है, बस इतना ही।

इस तथ्य पर प्रकाश डाला गया है कि पूरा ब्लॉक एक प्रीप्रोसेसर खंड है।

और वास्तव में, दोनों C और C ++ preprocessors चाहिए उपेक्षा #एक लाइन पर।


16
और कुछ टेक्स्ट एडिटर्स (जैसे, {या }विम) में नेविगेट करना आसान बनाता है ।
वचगिन

@Chargin, यह इस बात पर निर्भर करता है कि आप इसे कैसे देखते हैं। यदि आप दो प्रीप्रोसेसर ब्लॉकों के बीच नेविगेट करना चाहते हैं, तो जोड़ना #आपको उपयोग करने से रोकता है {या }। वास्तव में, }दो ब्लॉक के बीच में कूदने में सक्षम नहीं होने की तुलना में ब्लॉक पर (ओपी के उदाहरण में) कूदने के लिए दो बार प्रेस करना आसान हो सकता है ।
शहबाज

3
@ शहबाज निश्चित रूप से! अंगूठे का मेरा नियम है "तार्किक इकाइयों को एक साथ रखें," ताकि "पैराग्राफ" का वास्तव में अर्थ "विचार" हो। मैं प्रीप्रोसेसर घोषणाओं के साथ भी इस नियम का पालन करूंगा। बेशक, यह एक बड़ी हद तक व्यक्तिगत शैली का मामला है।
14

46

हमेशा अन्य संसाधनों पर निर्भर रहने के बजाय एक आधिकारिक स्रोत की जांच करें। C को ISO 9899 के रूप में मानकीकृत किया गया है :: 2011, C ++ में भी ISO मानक है। दोनों को अच्छी तरह से स्वीकार किया जाता है और एक छोटी खोज द्वारा उपलब्ध अंतिम ड्राफ्ट। 6.10.7 में C मानक स्थिति (C ++ में एक ही पाठ है):

प्रपत्र का एक पूर्वप्रक्रमक निर्देश

# new-line

कोई प्रभाव नहीं है।

यह एक अशक्त निर्देश है , जितना ;मूल भाषा में एक पूर्ववर्ती अभिव्यक्ति के बिना एक अशक्त कथन है

प्रीप्रोसेसर के लिए यह केवल स्वरूपण / पठनीयता के लिए है कि लाइनें एक साथ शब्दार्थ से संबंधित हों। (अर्धविराम OTOH शब्दार्थिक रूप से प्रासंगिक है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.