_T (আন্ডারস্কোর-টি) এর পরে কোন ধরণের প্রতিনিধিত্ব করে?


261

এটি সাধারণ প্রশ্নের মতো মনে হচ্ছে তবে আমি স্ট্যাক ওভারফ্লো অনুসন্ধান বা গুগলের সাথে এটি খুঁজে পাচ্ছি না। কোন ধরণের _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' এ শেষ হওয়া প্রচুর অতিরিক্ত ধরণের নাম সংজ্ঞায়িত করে এবং প্রয়োগের জন্য প্রত্যয়টি সংরক্ষণ করে । এর অর্থ হ'ল আপনি যদি পসিক্স-সম্পর্কিত সিস্টেমগুলিতে কাজ করে থাকেন তবে কনভেনশনের সাথে আপনার নিজস্ব নামগুলি সংজ্ঞায়িত করা খারাপ পরামর্শ দেওয়া হয়েছে। আমি যে সিস্টেমটিতে কাজ করি তা এটি করেছে (20 বছরেরও বেশি সময় ধরে); আমরা নিয়মিত যেমন সংজ্ঞায়িত করি তেমনি একই নামের সাথে সংজ্ঞায়িত ধরণের সিস্টেমগুলি দ্বারা বিভক্ত হয়ে যাই।


4
এটি যুক্তিসঙ্গত বলে মনে হয় যে ওএস এবং সাধারণ রানটাইম লাইব্রেরি জেনেরিক নাম সহ ধরণের সংজ্ঞা দেয়; তবে আপনার সংস্থার প্রকারগুলি কি একটি উপসর্গ বা কিছু দিয়ে চাপানো উচিত নয়?
টয় বিল্ডার

17
এটি এড়াতে আমি আমার টাইপডেফের উপর _t এর পরিবর্তে _ টাইপ ব্যবহার করি।
সিজারবি

4
@ জোনাথন লেফলার - ব্যবহারকারী-সংজ্ঞায়িত প্রকারের জন্য আপনি কোন নামকরণের কনভেনশন ব্যবহার করবেন?
জে অ্যান্ড্রু লফলিন

15
@ অ্যান্ড্রু: আপনার যদি উপসর্গ হিসাবে ব্যবহার করার জন্য সুবিধাজনক সংক্ষিপ্তসার থাকে, তবে আপনি abbr_xxxxx_tটাইপের নাম ব্যবহার করা নিরাপদ হতে পারেন । যেমন একটি উপসর্গ ব্যতীত আপনি যে কোন সময় ধরা পড়তে পারে। সাধারণত, মানক _tপ্রকারগুলি সমস্ত নিম্ন-কেস ব্যবহার করে ( FILEএবং DIRদুটি ব্যতিক্রম, দুবার - সমস্ত ক্যাপ এবং না _t), তাই আপনি CamelCase_tঅগ্রণী ক্যাপগুলি সহ বা ছাড়াই মাঝারি সুরক্ষা সহ ব্যবহার করতে পারেন । আমি যে সিস্টেমে মূলত কাজ করি তা বিপদজনকভাবে বেঁচে থাকে এবং _tযেভাবেই ব্যবহার করে , তবে এটি আমাদের উপলক্ষ করে তোলে। CamelCaseআমার নিজের কাজের জন্য প্রত্যয় ছাড়াই ব্যবহার করার ঝোঁক ; আমার ফাংশনগুলি সাধারণত সমস্ত নিম্ন-কেস হয়।
জোনাথন লেফলার

5
@ জোনাথনলফলার, আমি এই সম্মেলনটি ব্যবহার করেছি, প্রকারের জন্য ক্যামেলকেস, ফাংশনগুলির জন্য লোয়ারকেস ব্যবহার করব। আমি এই প্রশ্নটি অনুসন্ধান করে অনুসন্ধান করেছিলাম যে আমি কেবল একা নই। বৈধতার জন্য ধন্যবাদ!
অস্টিন মুলিনস

50

এটি একটি কনভেনশন যা ডেটা ধরণের নামকরণের জন্য ব্যবহৃত হয়, যেমন typedef:


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


43

_tসাধারণত একটি অস্বচ্ছ টাইপ সংজ্ঞা গোপন।

_tস্ট্যান্ডার্ড সি এবং পসিক্স (জিএনইউ সি লাইব্রেরি ম্যানুয়াল) এর ভবিষ্যতের সংস্করণগুলির সাথে দ্বন্দ্ব এড়াতে, জিসিসি কেবলমাত্র সেই নামগুলি যুক্ত করুন যা আপনি ব্যবহার করতে পারবেন না এমন সংরক্ষিত নেমস্পেসের সাথে শেষ হয় । কিছু গবেষণা করার পরে অবশেষে আমি পসিক্স স্ট্যান্ডার্ডের মধ্যে সঠিক তথ্যসূত্রটি খুঁজে পেয়েছি (1003.1, রেশনেল (তথ্যবহুল)):

B.2.12 ডেটা প্রকার

এই বিভাগে অতিরিক্ত ধরণের সংজ্ঞা '' _t '' এ শেষ হওয়া প্রয়োজন স্থানের দূষণের সমস্যার কারণে উত্সাহিত হয়েছিল। কোনও শিরোনামের ফাইলে কোনও প্রকারের (যেখানে সেই ধরণের আইইইই স্ট্যান্ড 1003.1-2001 দ্বারা সংজ্ঞায়িত করা হয় না) সংজ্ঞায়িত করা এবং প্রোগ্রামের নামের জায়গাতে চিহ্নগুলি যুক্ত না করে অন্যটিতে ব্যবহার করা শক্ত। প্রয়োগকারীদের তাদের নিজস্ব ধরণের সরবরাহ করার অনুমতি দেওয়ার জন্য, সমস্ত মেনে চলার অ্যাপ্লিকেশনগুলির '' _t '' এ শেষ হওয়া প্রতীকগুলি এড়াতে হবে, যা প্রয়োগকারীকে অতিরিক্ত ধরণের সরবরাহের অনুমতি দেয়। কারণ ধরণের একটি বড় ব্যবহার কাঠামোর সদস্যদের সংজ্ঞাতে হয়, যা আইইইই স্ট্যান্ড 1003.1-2001 এ সংজ্ঞায়িত কাঠামোর সাথে যুক্ত করা যেতে পারে (এবং অনেক ক্ষেত্রে অবশ্যই আবশ্যক), অতিরিক্ত ধরণের প্রয়োজন বাধ্যতামূলক।

সংক্ষেপে, স্ট্যান্ডার্ড বলে যে স্ট্যান্ডার্ড ধরণের তালিকাকে প্রসারিত করার ভাল সম্ভাবনা রয়েছে, সুতরাং স্ট্যান্ডার্ডটি _tনিজের ব্যবহারের জন্য নেমস্পেসকে সীমাবদ্ধ করে ।

উদাহরণস্বরূপ, আপনার প্রোগ্রামটি পসিক্স 1003.1 ইস্যু 6 এর সাথে মেলে এবং আপনি কোনও প্রকারের সংজ্ঞা দিয়েছেন foo_tপসিএক্স 1003.1 ইস্যু 7 শেষ পর্যন্ত একটি নতুন সংজ্ঞায়িত প্রকারের সাথে প্রকাশিত হয় foo_t। আপনার প্রোগ্রামটি নতুন সংস্করণের সাথে মেলে না, যা সমস্যা হতে পারে। ব্যবহারকে সীমাবদ্ধ করা _tকোডটিকে পুনরায় ব্যবহার করা থেকে বিরত করে। সুতরাং, যদি আপনি কোনও পসিক্স কম্পাইলেন্সির লক্ষ্য রাখেন _tতবে স্ট্যান্ডার্ডের হিসাবে এটি অবশ্যই আপনাকে এড়ানো উচিত ।

পার্শ্ব দ্রষ্টব্য: ব্যক্তিগতভাবে, আমি পসিক্সের সাথে লেগে থাকার চেষ্টা করি কারণ আমার ধারণা এটি পরিষ্কার প্রোগ্রামিংয়ের জন্য ভাল বেসিক দেয়। তদুপরি, আমি লিনাক্স কোডিং স্টাইল (অধ্যায় 5) নির্দেশিকা খুব পছন্দ করি । টাইপেডেফ ব্যবহার না করার কিছু ভাল কারণ রয়েছে। এই সাহায্য আশা করি!


18

এটি ডেটা টাইপগুলির জন্য সাধারণত একটি নামকরণ কনভেনশন, সাধারণত টাইপেডেফ দ্বারা সংজ্ঞায়িত। হার্ডওয়্যার রেজিস্টারগুলির সাথে সম্পর্কিত অনেকগুলি সি কোড স্বাক্ষরিত এবং স্বাক্ষরবিহীন স্থির-আকারের ডেটা ধরণের জন্য C99- সংজ্ঞায়িত মানক নাম ব্যবহার করে। কনভেনশন হিসাবে, এই নামগুলি একটি স্ট্যান্ডার্ড শিরোনাম ফাইল (stdint.h) এ থাকে এবং _t দিয়ে শেষ হয়।



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একটি নির্দিষ্ট আকারের পূর্ণসংখ্যা হিসাবে সংজ্ঞায়িত করতে পারেন। সি স্ট্যান্ডার্ড টাইপটির জন্য নির্দিষ্ট আকার নির্ধারণ করে না int(এটি আপনার সংকলক এবং লক্ষ্য প্ল্যাটফর্মের উপর নির্ভর করে, সম্ভাব্য) এবং একটি নির্দিষ্ট int_tধরণের ব্যবহারের ফলে সেই বহনযোগ্যতা সমস্যা এড়ানো যাবে।

এটি হার্ডওয়্যার ইন্টারফেস কোডের জন্য একটি বিশেষ গুরুত্বপূর্ণ বিবেচনা, যার কারণেই আপনি প্রথমে কনভেনশনটি লক্ষ্য করেছেন noticed


1
এটি খুব ভাল অনুশীলন হবে না, আমি একজনকে [u] int_ [32 16 8] _ সংজ্ঞা দেওয়ার আশা করব _ আপনি যে আকারটি নির্ধারণ করছেন সেটি কি তা পরিষ্কার করে দেবেন।
ইলিয়া

1
আপনি একেবারে ঠিক বলেছেন, "ইনট_টি" নিজেই প্রোগ্রামারকে বলে যে এটি কোনও ব্যবহারকারী সংজ্ঞায়িত টাইপ তবে এটি আসলে কী নয়!
গ্রেগ হিউগিল

0

উদাহরণস্বরূপ C99, /usr/incolve/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 সর্বদা মানে টাইপেইফ দ্বারা সংজ্ঞায়িত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.