2009-09-24 23 views
5

उद्घाटन अप Postgres codebase, मुझे लगता है कि सी कोड के बहुत से संकेत होने से लिखा है -> इस तरह से कि में अंकन:सी और सूचक संकेतन

(foo)->next = 5; 

मुझे पता है कि सूचक संकेतन है प्राथमिकता के स्तर, जैसे कि -> = (* foo)। और * foo जैसा नहीं है।

हालांकि, क्या इसका मतलब कुछ भी है जब ब्रांड्स वैरिएबल नाम से बाहर हैं और अगले पते का संदर्भ दे रहे हैं या क्या यह केवल एक सम्मेलन है जो कोडिंग शैली के लिए स्थानिक है?

उत्तर

6

यह एक कोडिंग सम्मेलन है जिसे मैंने पहले नहीं देखा है।

लेकिन यह कुछ भी नहीं बदलता है।

(foo)->next = 5; 

बिल्कुल

foo->next = 5; 
+0

बहुत बढ़िया, धन्यवाद। मैंने यही सोचा, और यह विशेष रूप से अजीब पाया क्योंकि यह कोडबेस में हर जगह था। – mduvall

+1

इस पर विस्तार करने के लिए, फू एक मैक्रो होने पर, आप इस निर्माण का उपयोग करने के कारण सुरक्षा-बेल्ट के रूप में हैं। यही कारण है कि कुछ सी स्टाइल गाइड (उदाहरण के लिए फ्रीबीएसडी) का सुझाव है कि सभी रिटर्न स्टेटमेंट फॉर्म रिटर्न (एक्स) के होंगे; बस एक्स की वापसी के बजाय; – Benno

+1

हालांकि यदि 'foo' एक मैक्रो थे, तो यह पूरी तरह से संश्लेषित करना बुद्धिमान होगा, उदा। '# परिभाषित करें foo (blargity-> blah)' –

1

यह व्यर्थ है। संश्लेषण का कोई प्रभाव नहीं पड़ता क्योंकि उनके अंदर अभिव्यक्ति इतनी सरल है। यह मूल रूप से

(*(foo)).next = 5; 

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

+0

क्या आपका मतलब ''(* (foo)) है। अगला = 5;''? –

+0

ओह। सही। कम से कम अब मुझे लगता है कि एक कारण है कि मैं अपने होमवर्क पर ध्यान केंद्रित नहीं कर सकता। इसे इंगित करने के लिए धन्यवाद, और रॉबर्ट को इसे ठीक करने के लिए धन्यवाद। –

2

के बराबर यह सुरक्षा के लिए एक कोडिंग सम्मेलन है।

सरल कोड में, जहां foo सिर्फ एक सूचक है, माता-पिता अनावश्यक हैं।

(foo)->next = 5; 

हालांकि, यदि कोई है या था पर विचार संभावना है कि foo एक मैक्रो से परिभाषित किया जा सकता है तो यह एक अधिक जटिल अभिव्यक्ति है।

उस स्थिति में, माता-पिता को गलत प्राथमिकता से बचने के लिए एक कंपाइलर त्रुटि या बदतर से बचने की आवश्यकता हो सकती है। कल्पना कीजिए कि अगर यह की तरह एक बदसूरत अभिव्यक्ति के लिए अनुवाद:

(++get_foo())->next = 5; 

या एक आम डाली:

((db_record*)foo_ptr)->next = 5; 

कुछ मुहावरेदार सी कोड के साथ ध्यान में रखना है कि मैक्रो अक्सर एक अमूर्त तंत्र के रूप में इस्तेमाल किया गया है चीजों के लिए हम अन्य भाषाओं में अधिक स्पष्ट रूप से कर सकते हैं ;-)

+0

कोई मैक्रो जो _doesn't_ इसे विस्तारित नहीं करता है वह एक समस्या है। आईएमएचओ मैक्रो-कॉलर की नौकरी नहीं, अपनी उपयोग सुरक्षा सुनिश्चित करने के लिए मैक्रो का काम होना चाहिए। –

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