2012-04-26 9 views
8

यह the structure for information about a file inode के संदर्भ में है:'स्ट्रक्चर स्टेट' में फ़ील्ड st_something नामक क्यों हैं?

dev_t  st_dev;  /* ID of device containing file */ 
ino_t  st_ino;  /* inode number */ 
mode_t  st_mode; /* protection */ 
nlink_t  st_nlink; /* number of hard links */ 
uid_t  st_uid;  /* user ID of owner */ 
gid_t  st_gid;  /* group ID of owner */ 
dev_t  st_rdev; /* device ID (if special file) */ 
off_t  st_size; /* total size, in bytes */ 
time_t  st_atime; /* time of last access */ 
time_t  st_mtime; /* time of last modification */ 
time_t  st_ctime; /* time of last status change */ 
blksize_t st_blksize; /* blocksize for filesystem I/O */ 
blkcnt_t st_blocks; /* number of blocks allocated */ 

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

+2

संकेत देने के लिए कि वे stat' डेटा होते हैं '। –

उत्तर

15

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

यह एक ऐतिहासिक रिकॉर्ड है। जब आप इस तरह के सदस्य नामों के साथ एक संरचना देखते हैं, तो आप जानते हैं कि यह पुराना है।

0

मुझे लगता है कि यह एक नामकरण सम्मेलन है ताकि जब आप सेंट _ देखेंगे, तो आप जानते हैं कि यह स्टेट स्ट्रक्चर का हिस्सा है (जो सेंट से शुरू होता है)।

+0

मुझे नहीं लगता था कि यह इतना आसान होगा लेकिन ऐसा प्रतीत होता है, धन्यवाद। – joethecoder

4

हंस के उत्तर के अलावा, मुझे लगता है कि नाम टकराव की बात अभी भी वास्तविकता है। हालांकि आधुनिक सी struct फ़ील्ड वैश्विक नाम स्थान में नहीं हैं, फिर भी वे मैक्रो परिभाषाओं के साथ संघर्ष कर सकते हैं।

यह एक कारण है कि हर कोई सामान्य रूप से अन्य पहचानकर्ता के लिए मैक्रो के लिए अपर केस तथा लोअर केस का उपयोग करता है में से एक है, लेकिन दुर्भाग्य से यह हमेशा संभव नहीं है। सी लाइब्रेरी में मैक्रोज़ हैं जो लोअरकेस में हैं: मूल रूप से लाइब्रेरी में प्रत्येक फ़ंक्शन में मैक्रो समकक्ष हो सकता है जो ऑप्टिमाइज़ेशन उद्देश्यों के लिए फ़ंक्शन को ओवरलोड करता है। आपके उदाहरण में, आप आसानी से सी (POSIX, जो कुछ भी) एक समारोह blksize दिखाई दे सकते हैं। यदि सदस्यों के लिए कोई st_ उपसर्ग नहीं होगा, तो एक दिन आप उस फ़ंक्शन को अधिभारित करना चाहते हैं, तो आप परेशानी में होंगे।

सी 11 और इसके प्रकार जेनेरिक मैक्रोज़ जो _Generic का उपयोग करते हैं, ऐसे मैक्रोज़ भी अधिक आम होंगे। इसलिए यदि आप ऐसी लाइब्रेरी तैयार कर रहे हैं जिसका उपयोग बहुत सारे कोड में किया जाना है जहां आपके पास पहचानकर्ताओं को कैसे चुना जाता है, इस पर हाथ नहीं है, तो आप अभी भी नामकरण सम्मेलन के साथ बेहतर होंगे।

यह सब न केवल struct सदस्यों पर लागू होता है, बल्कि inline फ़ंक्शंस के पैरामीटर नाम और चर के लिए भी लागू होता है।

+1

एक उदाहरण '#define st_atime st_atim.tv_sec', जो' एक वैश्विक नाम है कि देखते हुए नियमों का पालन नहीं करता है st_atime' बनाता है जैसे मैक्रो है। – musiphil

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