Ini sepertinya pertanyaan sederhana, tetapi saya tidak dapat menemukannya dengan pencarian Stack Overflow atau Google. Apa jenis diikuti oleh _t
mean? Seperti
int_t anInt;
Saya melihatnya dalam kode C yang dimaksudkan untuk berhubungan erat dengan perangkat keras — saya tidak bisa tidak berpikir mereka terkait.
c
naming-conventions
types
Kevin Griffin
sumber
sumber
int_t
didefinisikan? Jika selalu didefinisikan sebagaiint
, itu tidak berguna; itu jauh lebih jelas untuk digunakanint
secara langsung. Jika itu tidak selalu didefinisikan sebagaiint
(katakanlah, jika bisalong int
ataushort int
), maka itu adalah nama yang dipilih dan membingungkan.Jawaban:
Seperti yang dicatat oleh Douglas Mayle, ini pada dasarnya menunjukkan nama tipe. Akibatnya, Anda akan keliru untuk mengakhiri nama variabel atau fungsi dengan '
_t
' karena dapat menyebabkan kebingungan. Sertasize_t
, yang mendefinisikan standar C89wchar_t
,off_t
,ptrdiff_t
, dan mungkin beberapa orang lain aku sudah lupa. The C99 standar mendefinisikan banyak jenis tambahan, sepertiuintptr_t
,intmax_t
,int8_t
,uint_least16_t
,uint_fast32_t
, dan sebagainya. Tipe-tipe baru ini secara formal didefinisikan<stdint.h>
tetapi paling sering Anda akan menggunakan<inttypes.h>
yang (tidak biasa untuk header C standar) termasuk<stdint.h>
. Ini (<inttypes.h>
) juga mendefinisikan makro untuk digunakan denganprintf()
danscanf()
.Seperti yang dicatat oleh Matt Curtis, tidak ada arti penting bagi kompiler dalam sufiks; itu adalah konvensi yang berorientasi pada manusia.
Namun, Anda juga harus mencatat bahwa POSIX mendefinisikan banyak nama tipe tambahan yang diakhiri dengan '
_t
', dan menyimpan akhiran untuk implementasi. Itu berarti bahwa jika Anda bekerja pada sistem yang berhubungan dengan POSIX, mendefinisikan nama tipe Anda sendiri dengan konvensi tidak disarankan. Sistem yang saya kerjakan telah melakukannya (lebih dari 20 tahun); kami secara teratur tersandung oleh sistem yang mendefinisikan tipe dengan nama yang sama seperti yang kami definisikan.sumber
abbr_xxxxx_t
nama jenis. Tanpa awalan seperti itu, Anda bisa ketahuan kapan saja. Secara umum,_t
tipe standar menggunakan semua huruf kecil (FILE
danDIR
dua pengecualian, dua kali - semua tutup, dan tidak_t
), sehingga Anda dapat menggunakanCamelCase_t
dengan keamanan sedang, dengan atau tanpa tutup depan. Sistem tempat saya bekerja cenderung hidup berbahaya dan menggunakannya_t
, tetapi kadang-kadang mengganggu kita. Saya cenderung menggunakanCamelCase
tanpa akhiran untuk pekerjaan saya sendiri; fungsi saya biasanya semua huruf kecil.Ini adalah konvensi yang digunakan untuk memberi nama tipe data, misalnya dengan
typedef
:sumber
The
_t
biasanya membungkus sebuah definisi jenis buram.GCC hanya menambahkan nama yang diakhiri dengan
_t
namespace cadangan yang tidak boleh Anda gunakan, untuk menghindari konflik dengan versi Standar C dan POSIX yang akan datang (manual pustaka GNU C) . Setelah beberapa penelitian, saya akhirnya menemukan referensi yang benar di dalam Standar POSIX (1003.1, Rationale (Informative)):Singkatnya, Standar mengatakan bahwa ada peluang bagus untuk memperpanjang daftar tipe Standar, oleh karena itu Standar membatasi
_t
ruang nama untuk penggunaannya sendiri.Misalnya, program Anda cocok dengan POSIX 1003.1 Masalah 6 dan Anda menentukan jenisnya
foo_t
. POSIX 1003.1 Masalah 7 akhirnya dirilis dengan tipe yang baru didefinisikanfoo_t
. Program Anda tidak cocok dengan versi baru, yang mungkin menjadi masalah. Membatasi_t
penggunaan mencegah dari refactoring kode. Dengan demikian, jika Anda bertujuan untuk kepatuhan POSIX, Anda harus menghindari standar_t
sebagaimana dinyatakan olehnya.Catatan: secara pribadi, saya mencoba untuk tetap pada POSIX karena saya pikir itu memberikan dasar-dasar yang baik untuk pemrograman bersih. Terlebih lagi, saya cukup menyukai panduan Linux Coding Style (bab 5) . Ada beberapa alasan bagus mengapa tidak menggunakan typedef. Semoga bantuan ini!
sumber
Ini adalah konvensi penamaan standar untuk tipe data, biasanya ditentukan oleh typedefs. Banyak kode C yang berhubungan dengan register perangkat keras menggunakan nama standar yang ditentukan C99 untuk tipe data ukuran tetap yang ditandatangani dan tidak ditandatangani. Sebagai konvensi, nama-nama ini dalam file header standar (stdint.h), dan diakhiri dengan _t.
sumber
Itu hanya konvensi yang berarti "mengetik". Itu berarti tidak ada yang istimewa bagi kompiler.
sumber
Secara
_t
inheren tidak memiliki makna khusus. Tapi itu sudah umum digunakan untuk menambahkan_t
akhiran ke typedef.Anda mungkin lebih terbiasa dengan praktik C yang umum untuk penamaan variabel ... Ini mirip dengan bagaimana biasa menempel ap di depan untuk penunjuk, dan menggunakan garis bawah di depan variabel global (ini agak kurang umum) , dan menggunakan nama variabel
i
,j
dank
untuk variabel lingkaran sementara.Dalam kode di mana ukuran kata dan pemesanan penting, sangat umum untuk menggunakan jenis yang ditentukan khusus yang eksplisit, seperti
BYTE
WORD
(biasanya 16-bit)DWORD
(32-bit).int_t
tidak begitu baik, karena definisiint
bervariasi di antara platform - jadi siapaint
yang Anda sesuaikan? (Meskipun, saat ini, sebagian besar pengembangan PC-sentris memperlakukannya sebagai 32 bit, banyak hal untuk pengembangan non-PC masih memperlakukan int sebagai 16 bit).sumber
Itu artinya tipe.
size_t
adalah tipe ukuran.sumber
Ada beberapa penjelasan bagus tentang masalah ini. Hanya untuk menambahkan alasan lain untuk mendefinisikan kembali jenis:
Dalam banyak proyek tertanam, semua jenis didefinisikan ulang untuk dengan benar menyatakan ukuran yang diberikan untuk jenis dan untuk meningkatkan portabilitas di berbagai platform (yaitu kompiler jenis perangkat keras).
Alasan lain adalah untuk membuat kode Anda portabel di berbagai OS dan untuk menghindari tabrakan dengan tipe yang ada di OS yang Anda integrasikan dalam kode Anda. Untuk ini, biasanya awalan yang unik (mungkin) ditambahkan.
Contoh:
sumber
Jika Anda berurusan dengan kode antarmuka perangkat keras, pembuat kode yang Anda lihat mungkin telah didefinisikan
int_t
sebagai bilangan bulat ukuran tertentu. Standar C tidak menetapkan ukuran spesifik untukint
tipe (itu tergantung pada kompiler dan platform target Anda, berpotensi), dan menggunakanint_t
tipe spesifik akan menghindari masalah portabilitas.Ini adalah pertimbangan yang sangat penting untuk kode antarmuka perangkat keras, yang mungkin mengapa Anda pertama kali memperhatikan konvensi di sana.
sumber
Misalnya di C99, /usr/include/stdint.h:
_t
selalu berarti didefinisikan oleh typedef.sumber