_T (अंडरस्कोर-टी) द्वारा किस प्रकार का प्रतिनिधित्व करता है?


261

यह एक साधारण प्रश्न की तरह लगता है, लेकिन मैं इसे स्टैक ओवरफ्लो खोज या Google के साथ नहीं पा सकता हूं। एक _tमाध्य के बाद एक प्रकार क्या है ? जैसे कि

int_t anInt;

मुझे लगता है कि सी कोड में बहुत सारे हार्डवेयर के साथ निकटता से निपटने का मतलब है - मैं मदद नहीं कर सकता लेकिन लगता है कि वे संबंधित हैं।


3
कहाँ int_tपरिभाषित किया गया है? यदि इसे हमेशा परिभाषित किया जाता है int, तो यह उपयोगी नहीं है; यह intसीधे उपयोग करने के लिए बहुत स्पष्ट है । यदि इसे हमेशा के रूप में परिभाषित नहीं किया जाता है int(जैसे, यदि यह हो सकता है long intया short int), तो यह एक खराब चुना हुआ और भ्रमित करने वाला नाम है।
कीथ थॉम्पसन

जवाबों:


213

जैसा कि डगलस मेले ने कहा, यह मूल रूप से एक प्रकार का नाम दर्शाता है। नतीजतन, आपको ' _t' के साथ चर या फ़ंक्शन नामों को समाप्त करने के लिए बीमार किया जाएगा क्योंकि यह कुछ भ्रम पैदा कर सकता है। साथ ही size_t, C89 मानक परिभाषित करता है wchar_t, off_t, ptrdiff_t, और शायद कुछ अन्य लोगों के मैं भूल गया हूँ। C99 मानक जैसे अतिरिक्त प्रकार, का एक बहुत कुछ को परिभाषित करता है uintptr_t, intmax_t, int8_t, uint_least16_t, uint_fast32_t, और इतने पर। इन नए प्रकारों को औपचारिक रूप से परिभाषित किया गया है, <stdint.h>लेकिन अक्सर आप उनका उपयोग करेंगे <inttypes.h>(असामान्य रूप से मानक सी हेडर के लिए) शामिल हैं <stdint.h>। यह ( <inttypes.h>) भी printf()और के साथ उपयोग के लिए मैक्रोज़ को परिभाषित करता है scanf()

जैसा कि मैट कर्टिस ने उल्लेख किया है, प्रत्यय में संकलक के लिए कोई महत्व नहीं है; यह एक मानव-उन्मुख सम्मेलन है।

हालाँकि, आपको यह भी ध्यान देना चाहिए कि POSIX 'में समाप्त होने वाले अतिरिक्त प्रकार के नामों को परिभाषित करता है _t, और कार्यान्वयन के लिए प्रत्यय को आरक्षित करता है। इसका मतलब है कि यदि आप POSIX- संबंधित प्रणालियों पर काम कर रहे हैं, तो सम्मेलन के साथ अपने स्वयं के प्रकारों को परिभाषित करना अशुभ है। मैंने जिस सिस्टम पर काम किया है, उसने इसे (20 से अधिक वर्षों के लिए) किया है; हम नियमित रूप से सिस्टम को उसी नाम से परिभाषित करते हुए टाइप करते जाते हैं, जैसा कि हम परिभाषित करते हैं।


4
यह उचित लगता है कि ओएस और सामान्य रनटाइम लाइब्रेरी सामान्य नामों के साथ प्रकारों को परिभाषित करते हैं; लेकिन क्या आपकी कंपनी के प्रकारों को भी उपसर्ग या कुछ के साथ नहीं जोड़ा जाना चाहिए?
टॉयबिल्डर

17
मैं इससे बचने के लिए अपने टाइप किए गए शब्दों पर _t के बजाय _type का उपयोग करता हूं।
सीजरबी

4
@ जोनाथन लेफ़लर - उपयोगकर्ता-परिभाषित प्रकारों के लिए आप किस नामकरण सम्मेलन का उपयोग करेंगे?
जे। एंड्रयू लॉफलिन

15
@ और: यदि आपके पास उपसर्ग के रूप में उपयोग करने के लिए एक सुविधाजनक संक्षिप्त नाम है, तो आप abbr_xxxxx_tटाइप नामों का उपयोग करने के लिए सुरक्षित हो सकते हैं । इस तरह के उपसर्ग के बिना, आप किसी भी समय पकड़े जा सकते हैं। आम तौर पर, मानकीकृत _tप्रकार सभी लोअर-केस का उपयोग करते हैं ( FILEऔर DIRदो अपवाद हैं, दो बार - सभी कैप, और नहीं _t), इसलिए आप CamelCase_tअग्रणी कैप के साथ या बिना मध्यम सुरक्षा के साथ उपयोग कर सकते हैं । सिस्टम मैं मुख्य रूप से खतरनाक तरीके से जीने और _tवैसे भी उपयोग करने के लिए काम करता है , लेकिन इसने हमें अवसरों पर काट लिया है। मैं CamelCaseअपने काम के लिए एक प्रत्यय के बिना उपयोग करते हैं; मेरे कार्य आमतौर पर सभी लोअर-केस होते हैं।
जोनाथन लेफ़लर

5
@JonathanLeffler, मैंने उस सम्मेलन का उपयोग करना शुरू कर दिया है, प्रकार के लिए CamelCase, कार्यों के लिए लोअरकेस। मैंने इस प्रश्न की खोज की कि मैं केवल यही नहीं था। सत्यापन के लिए धन्यवाद!
ऑस्टिन मुलिंस

50

यह डेटा प्रकारों के नामकरण के लिए उपयोग किया जाने वाला सम्मेलन है, जैसे typedef:


typedef struct {
  char* model;
  int year;
...
} car_t;


43

_tआम तौर पर एक अपारदर्शी प्रकार परिभाषा गिर्द घूमती है।

जीसीसी केवल उन नामों को जोड़ते हैं जो _tआपके द्वारा उपयोग किए जाने वाले आरक्षित नामस्थान के साथ समाप्त होते हैं, मानक सी और पॉसिक्स (जीएनयू सी लाइब्रेरी मैनुअल) के भविष्य के संस्करणों के साथ संघर्ष से बचने के लिए । कुछ शोध के बाद, मुझे आखिरकार POSIX Standard (1003.1, Rationale (Informative)) के अंदर सही संदर्भ मिला:

B.2.12 डेटा प्रकार

इस खंड में '' _t '' में परिभाषित अतिरिक्त प्रकार की आवश्यकता को नाम स्थान प्रदूषण की समस्या से प्रेरित किया गया था। एक हेडर फ़ाइल में एक प्रकार (जहाँ उस प्रकार को IEEE Std 1003.1-2001 द्वारा परिभाषित नहीं किया गया है) को परिभाषित करना मुश्किल है और प्रोग्राम के नाम स्थान पर प्रतीकों को जोड़े बिना किसी अन्य में इसका उपयोग करें। कार्यान्वयनकर्ताओं को अपने प्रकार प्रदान करने की अनुमति देने के लिए, '' _t '' में समाप्त होने वाले प्रतीकों से बचने के लिए सभी अनुरूप अनुप्रयोगों की आवश्यकता होती है, जो कार्यान्वयनकर्ता को अतिरिक्त प्रकार प्रदान करने की अनुमति देता है। क्योंकि प्रकारों का एक प्रमुख उपयोग संरचना सदस्यों की परिभाषा में है, जो (और कई मामलों में) IEEE Std 1003.1-2001 में परिभाषित संरचनाओं में जोड़ा जा सकता है, अतिरिक्त प्रकारों की आवश्यकता अनिवार्य है।

संक्षेप में, मानक का कहना है कि मानक प्रकार की सूची को विस्तारित करने की अच्छी संभावनाएं हैं, इसलिए मानक _tअपने स्वयं के उपयोग के लिए नामस्थान को प्रतिबंधित करता है ।

उदाहरण के लिए, आपका प्रोग्राम POSIX 1003.1 अंक 6 से मेल खाता है और आपने एक प्रकार परिभाषित किया है foo_tPOSIX 1003.1 अंक 7 आखिरकार एक नए परिभाषित प्रकार के साथ जारी किया गया है foo_t। आपका कार्यक्रम नए संस्करण से मेल नहीं खाता है, जो एक समस्या हो सकती है। _tउपयोग को प्रतिबंधित करने से कोड को फिर से सक्रिय करने से रोकता है। इस प्रकार, यदि आप POSIX अनुपालन का लक्ष्य रखते हैं, तो आपको निश्चित _tरूप से मानक राज्यों के रूप में इससे बचना चाहिए ।

साइड नोट: व्यक्तिगत रूप से, मैं POSIX से चिपके रहने की कोशिश करता हूं क्योंकि मुझे लगता है कि यह स्वच्छ प्रोग्रामिंग के लिए अच्छी मूल बातें देता है। इसके अलावा, मैं लिनक्स कोडिंग स्टाइल (अध्याय 5) दिशानिर्देशों का बहुत शौकीन हूं । कुछ अच्छे कारण हैं कि टाइपिफ़ाइड का उपयोग क्यों नहीं किया जाता है। उममीद है कि इससे मदद मिलेगी!


18

यह डेटा प्रकारों के लिए एक मानक नामकरण सम्मेलन है, जिसे आमतौर पर टाइपडेफ द्वारा परिभाषित किया जाता है। हार्डवेयर रजिस्टरों से संबंधित बहुत सी कोड, हस्ताक्षरित और अहस्ताक्षरित निश्चित-आकार के डेटा प्रकारों के लिए C99- परिभाषित मानक नामों का उपयोग करता है। एक सम्मेलन के रूप में, ये नाम एक मानक हेडर फ़ाइल (stdint.h) में हैं, और _t के साथ समाप्त होते हैं।


11

यह सिर्फ एक सम्मेलन है जिसका अर्थ है "प्रकार"। इसका मतलब संकलक के लिए कुछ खास नहीं है।


11

_tस्वाभाविक किसी भी विशेष अर्थ नहीं है। लेकिन यह _tटाइफेड के प्रत्यय को जोड़ने के लिए आम उपयोग में आ गया है ।

चर नामकरण के लिए आप सामान्य सी प्रथाओं से अधिक परिचित हो सकते हैं ... यह एक सूचक के लिए सामने एपी पर छड़ी करने के लिए और वैश्विक चर के सामने एक अंडरस्कोर का उपयोग करने के लिए कैसे समान है (यह थोड़ा कम सामान्य है) , और चर नाम का उपयोग करने के i, jऔर kअस्थायी पाश चर के लिए।

कोड में जहां शब्द-आकार और ऑर्डर करना महत्वपूर्ण है, यह कस्टम परिभाषित प्रकारों का उपयोग करने के लिए बहुत सामान्य है, जो स्पष्ट हैं, जैसे BYTE WORD(सामान्य रूप से 16-बिट) DWORD(32-बिट)।

int_tयह इतना अच्छा नहीं है, क्योंकि intप्लेटफार्मों के बीच भिन्नता की परिभाषा है - तो intआप किसके अनुरूप हैं? (हालांकि, इन दिनों, अधिकांश पीसी-केंद्रित विकास इसे 32 बिट्स के रूप में मानते हैं, गैर-पीसी विकास के लिए बहुत सामान अभी भी इंट के 16 बिट्स के रूप में व्यवहार करते हैं)।



8

विषय के बारे में कुछ अच्छी व्याख्याएँ थीं। प्रकारों को फिर से परिभाषित करने के लिए बस एक और कारण जोड़ना है:

कई एम्बेडेड प्रोजेक्ट्स में, सभी प्रकारों को दिए गए साइज़ को सही ढंग से बताने और विभिन्न प्लेटफार्मों (यानी हार्डवेयर प्रकार कंपाइलर्स) पर पोर्टेबिलिटी को बेहतर बनाने के लिए फिर से परिभाषित किया जाता है।

एक अन्य कारण विभिन्न ओएस में आपके कोड को पोर्टेबल बनाना होगा और ओएस में मौजूदा प्रकारों के साथ टकराव से बचने के लिए जिसे आप अपने कोड में एकीकृत कर रहे हैं। इसके लिए, आमतौर पर एक अनूठा (संभव के रूप में) उपसर्ग जोड़ा जाता है।

उदाहरण:

typedef unsigned long dc_uint32_t;

7

यदि आप हार्डवेयर इंटरफ़ेस कोड के साथ काम कर रहे हैं, तो जिस कोड को आप देख रहे हैं उसके लेखक ने int_tएक विशिष्ट आकार पूर्णांक के रूप में परिभाषित किया है। C मानक intप्रकार को एक विशिष्ट आकार प्रदान नहीं करता है (यह आपके कंपाइलर और लक्ष्य प्लेटफ़ॉर्म, संभावित रूप से निर्भर करता है), और एक विशिष्ट int_tप्रकार का उपयोग करने से उस पोर्टेबिलिटी की समस्या से बचा जा सकता है।

यह हार्डवेयर इंटरफ़ेस कोड के लिए एक विशेष रूप से महत्वपूर्ण विचार है, यही वजह है कि आपने पहली बार सम्मेलन को देखा है।


1
यह बहुत अच्छा अभ्यास नहीं होगा, मुझे उम्मीद है कि कोई भी आपको परिभाषित करने के लिए [u] int_ [32 16 8] _t को स्पष्ट करेगा कि आपका आकार क्या है।
इल्या

1
आप काफी हद तक सही हैं, "int_t" अपने आप में प्रोग्रामर को बताता है कि यह एक उपयोगकर्ता परिभाषित प्रकार है, लेकिन ऐसा नहीं है जो वास्तव में है!
ग्रेग हेविल जिल

0

C99 में उदाहरण के लिए, /usr/include/stdint.h:

typedef unsigned char           uint8_t;
typedef unsigned short int      uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int            uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int       uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

_t हमेशा टाइपफेड द्वारा परिभाषित का मतलब है।

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