2010-10-17 6 views
16

man 2 open लिखते समय मैं इस प्रश्न में भाग गया। यह कहता है कि दो प्रकार के खुले हैं, एक दो तर्क के साथ, और तीन के साथ एक! पिछली बार मैंने जांच की थी कि हम सी में कार्यों को अधिभारित नहीं कर सके। उन्होंने यह कैसे किया? क्या उन्होंने सी ++ में लिखा था?'मैन 2 ओपन' क्यों कहता है कि दो प्रकार के खुले हैं?

int open(const char * pathname, int flags); 
int open(const char * pathname, int flags, mode_t mode); 

उत्तर

19

नहीं, वे सिर्फ विविध कार्य का उपयोग करते हैं।

int open(const char * pathname, int flags, ...); 

यह अंतिम तर्क mode वैकल्पिक बनाता है। प्रोटोटाइप केवल दिखाते हैं कि फ़ंक्शन का उपयोग कैसे किया जाना चाहिए, वास्तविक इंटरफ़ेस नहीं।

बेशक

, वास्तविक से अधिक भार के विपरीत, संकलक टाइप-जाँच कर सकते हैं नहीं mode तर्क है, तो उपयोगकर्ता सावधान अतिरिक्त सुनिश्चित करने के लिए केवल 2 या 3 तर्क पारित कर रहे हैं रहना होगा, और 3 तर्क एक mode_t होना चाहिए।


BTW, अगर आप बीएसडी (ओएस एक्स सहित) के लिए man 2 open जाँच यह correct prototype as above को दर्शाता है।

+1

यदि संकलक POSIX से अवगत है या कुछ भाषा विस्तार के माध्यम से फ़ंक्शन के तर्क प्रकारों से अवगत कराया गया है, तो यह जांच कर सकता है। यदि जीसीसी/ग्लिबैक पहले से ही ऐसा नहीं कर रहे हैं, तो मैं उन्हें 'printf' तर्क जांच की तरह ही इसे जल्द ही जोड़ने के लिए आश्चर्यचकित नहीं होगा। –

+0

धन्यवाद, यह वास्तव में मदद की। –

7

नहीं, उन्होंने varargs का उपयोग करके सी में लिखा था।

stdarg.h देखें, जहां उदाहरण हैं।

एक भिन्न कार्य ellipsis से कई तर्कों को पढ़ सकता है। कोई भी अतिरिक्त तर्क जो फ़ंक्शन "नहीं चाहता" वास्तव में त्याग दिया जाता है।

8

इसके लायक होने के लिए, मैन पेज गलत है। प्रोटोटाइप यह पता चलता है:

int open(const char * pathname, int flags); 
int open(const char * pathname, int flags, mode_t mode); 

नहीं हैं सही प्रोटोटाइप के बराबर:

int open(const char * pathname, int flags, ...); 

गलत लोगों को यह प्रदान करता है का उपयोग करना (जैसे आप समारोह अपने आप के बजाय सही हैडर सहित प्रोटोटाइप हैं) आपके प्रोग्राम को अपरिभाषित व्यवहार करने का कारण बन जाएगा। (और यह केवल सैद्धांतिक नहीं है; यह शायद x86_64 और पास-दर-रजिस्टर एबीआई के साथ अन्य प्लेटफार्मों पर चलने में विफल रहेगा।)

क्या मैन पेज व्यक्त करने की कोशिश कर रहा था (और बहुत खराब काम करना) कि open की तर्क सूची का विविध भाग या तो खाली हो सकता है या एक mode_t प्रकार तर्क हो सकता है, जहां वैकल्पिक तर्क की अनुपस्थिति या उपस्थिति flags के मान पर निर्भर करती है।

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