di C (ANSI, C99, dll.), struct tinggal di namespace mereka sendiri. Sebuah struct untuk daftar tertaut mungkin terlihat seperti ini:
struct my_buffer_type {
struct my_buffer_type * next;
struct my_buffer_type * prev;
void * data;
};
Tampaknya cukup alami namun bagi kebanyakan programmer C untuk secara otomatis mengetikkan struct tersebut seperti berikut
typedef struct tag_buffer_type {
struct tag_buffer_type * next;
struct tag_buffer_type * prev;
void * data;
} my_buffer_type;
Dan kemudian referensi struct seperti tipe normal, yaitu get_next_element(my_buffer_type * ptr)
.
Sekarang pertanyaan saya adalah: Apakah ada alasan khusus untuk ini?
Wikipedia mengatakan http://en.wikipedia.org/wiki/Typedef#Usage_concerns
Beberapa orang menentang penggunaan typedef yang ekstensif. Sebagian besar argumen berpusat pada gagasan bahwa typedef hanya menyembunyikan tipe data aktual dari suatu variabel. Sebagai contoh, Greg Kroah-Hartman, seorang hacker dan dokumenter kernel Linux, mengecilkan penggunaannya untuk apa pun kecuali deklarasi prototipe fungsi. Dia berpendapat bahwa praktik ini tidak hanya mengaburkan kode yang tidak perlu, tetapi juga dapat menyebabkan programmer secara tidak sengaja menyalahgunakan struktur besar berpikir mereka adalah tipe sederhana. [4]
Lainnya berpendapat bahwa penggunaan typedef dapat membuat kode lebih mudah dipelihara. K&R menyatakan bahwa ada dua alasan untuk menggunakan typedef. Pertama, ini menyediakan sarana untuk membuat program lebih portabel. Alih-alih harus mengubah jenis di mana pun itu muncul di seluruh file sumber program, hanya pernyataan typedef tunggal yang perlu diubah. Kedua, typedef dapat membuat deklarasi kompleks lebih mudah dipahami.
Saya pribadi bertanya-tanya apakah tidak ada cukup manfaat memiliki struct
namespace terpisah untuk kadang-kadang tidak menggunakan struct typedef'd dan karena ada beberapa budaya pemrograman C sekitar (pemrograman Windows C memiliki tradisi yang berbeda dari pemrograman Linux C dalam pengalaman saya) jika ada tradisi yang tidak saya sadari.
Kemudian saya tertarik pada pertimbangan historis (pendahulu, versi pertama C).
sumber
typedef
adalah untuk menyembunyikan tipe variabel yang sebenarnya. Ambiltime_t
sebagai contoh: jika orang berkeliling menggunakan tipe integer yang mendasarinya, perubahan dalam implementasi seperti itulah yang akan diperlukan pada tahun 2038 akan memecahkan banyak sekali kode. FJika orang menggunakan struktur tanpa memahami alasannya, itu adalah kegagalan pada programmer, bukan konstruknya.Jawaban:
Saya bekerja pada proyek besar yang banyak menggunakan struct typedef'd. Kami melakukannya karena beberapa alasan. Harap diingat bahwa ini adalah pemisahan pra-C99 dan namespace.
Lebih mudah mengetik
my_buffer_type *buffer
daripadastruct tag_buffer_type *buffer
, dan untuk ukuran basis kode (1M + loc) yang membuat perbedaan besar.Itu abstrak struktur menjadi objek. Daripada fokus pada setiap variabel individu dalam struct, kami akan fokus pada objek data yang diwakilinya. Abstraksi ini menyebabkan umumnya lebih bermanfaat dan lebih mudah untuk menulis kode.
Memperlakukan struktur sebagai objek juga memungkinkan kami untuk merangkum informasi dengan lebih baik. Peninjauan kode menangkap beberapa situasi di mana pengembang yang lebih baru akan melanggar prinsip enkapsulasi yang telah kami lakukan. Menggunakan typedef'd structs benar-benar membuat pelanggaran itu jelas.
Portabilitas menjadi perhatian ketika kami menulis untuk setengah lusin platform dengan server dan beberapa lagi dengan klien.
sumber
Setiap kali alih-alih mengetik
jika Anda memilikinya
typedef
, Anda dapat langsung menggunakantypedef
Penggunaan utama adalah untuk mengurangi jumlah penekanan tombol yang diperlukan untuk menulis kode dan untuk meningkatkan keterbacaan.sumber