Mengapa menggunakan typedefs untuk struct?

12

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 structnamespace 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).

Wirrbel
sumber
4
Tujuan dari a typedef adalah untuk menyembunyikan tipe variabel yang sebenarnya. Ambil time_tsebagai 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.
Blrfl

Jawaban:

14

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.

  1. Lebih mudah mengetik my_buffer_type *bufferdaripada struct tag_buffer_type *buffer, dan untuk ukuran basis kode (1M + loc) yang membuat perbedaan besar.

  2. 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.

    • Saya pikir ini bertentangan langsung dengan kutipan yang dikaitkan dengan Greg Kroah-Hartman yang Anda berikan. FWIW, proyek itu adalah aplikasi klien / server dan bukan kernel sehingga pasti ada beberapa pertimbangan yang berbeda untuk dipertimbangkan.
  3. 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.

  4. Portabilitas menjadi perhatian ketika kami menulis untuk setengah lusin platform dengan server dan beberapa lagi dengan klien.


sumber
5

Setiap kali alih-alih mengetik

struct my_buffer_type *buffer;

jika Anda memilikinya typedef, Anda dapat langsung menggunakan

my_buffer_type *buffer;

typedefPenggunaan utama adalah untuk mengurangi jumlah penekanan tombol yang diperlukan untuk menulis kode dan untuk meningkatkan keterbacaan.

AMohan
sumber
Anda benar tetapi saya sudah menggambarkan fakta ini dalam pertanyaan saya.
wirrbel