Typedef
2006-03-28 · #Programming
Meski sering dianggap sebagai storage class, typedef sebenarnya bukan. Ia memungkinkan kita memperkenalkan sinonim untuk tipe yang sebetulnya bisa dideklarasikan dengan cara lain. Nama baru itu menjadi setara dengan tipe yang kita inginkan, seperti contoh berikut.
typedef int aaa, bbb, ccc; typedef int ar[15], arr[9][6]; typedef char c, *cp, carr[100]; /* now declare some objects */ /* all ints */ aaa int1; bbb int2; ccc int3; ar yyy; /* array of 15 ints */ arr xxx; /* 9*6 array of int */ c ch; /* a char */ cp pnt; /* pointer to char */ carr chry; /* array of 100 char */
Aturan umum memakai typedef: tulis dulu deklarasinya seolah-olah Anda sedang mendeklarasikan variabel bertipe yang diinginkan. Di tempat deklarasi itu tadinya memperkenalkan nama variabel, menambahkan typedef di depannya membuat yang lahir bukan variabel melainkan nama tipe baru. Nama tipe baru itu lalu bisa dipakai sebagai awalan deklarasi variabel bertipe tersebut.
Penggunaan typedef tidak terlalu sering terlihat di kebanyakan program; biasanya hanya muncul di header file dan jarang jadi urusan koding sehari-hari.
Ia kadang dipakai pada aplikasi yang menuntut portabilitas sangat tinggi: di sana tipe-tipe baru didefinisikan untuk variabel dasar program, lalu typedef yang sesuai dipakai untuk menyesuaikan program dengan mesin target. Kalau berlebihan, hasilnya adalah kode yang sulit dibaca programmer C dari lingkungan lain. Kira-kira begini rasanya:
/* file 'mytype.h' */ typedef short SMALLINT /* range *******30000 */ typedef int BIGINT /* range ******* 2E9 */ /* program */ #include "mytype.h" SMALLINT i; BIGINT loop_count;
Di sebagian mesin, jangkauan int tidak cukup untuk BIGINT, sehingga harus di-typedef ulang menjadi long.
Untuk memakai ulang nama yang sudah dideklarasikan sebagai typedef, deklarasinya harus memuat setidaknya satu type specifier supaya tidak ambigu:
typedef int new_thing;
func(new_thing x){
float new_thing;
new_thing = x;
}
Perlu diingat, typedef hanya bisa mendeklarasikan tipe nilai kembalian sebuah fungsi, bukan tipe fungsi secara keseluruhan. Tipe keseluruhan mencakup informasi parameter fungsi, bukan cuma tipe kembaliannya.
/*
* Using typedef, declare 'func' to have type
* 'function taking two int arguments, returning int'
*/
typedef int func(int, int);
/* ERROR */
func func_name{ /*....*/ }
/* Correct. Returns pointer to a type 'func' */
func *func_name(){ /*....*/ }
/*
* Correct if functions could return functions,
* but C can't.
*/
func func_name(){ /*....*/ }
Kalau sebuah typedef dengan identifier tertentu sedang berada dalam scope, identifier itu tidak boleh dipakai sebagai formal parameter fungsi. Sebabnya, deklarasi seperti berikut menimbulkan masalah:
typedef int i1_t, i2_t, i3_t, i4_t; int f(i1_t, i2_t, i3_t, i4_t)/*THIS IS POINT 'X'*/
Compiler yang membaca deklarasi fungsi itu sampai di titik ‘X’ dan masih belum tahu apakah yang dilihatnya deklarasi fungsi, yang pada dasarnya mirip
int f(int, int, int, int) /* prototype */
atau
int f(a, b, c, d) /* not a prototype */
— persoalannya (dalam kasus terburuk) baru selesai setelah melihat apa yang ada sesudah titik ‘X’: kalau titik koma berarti tadi deklarasi, kalau { berarti tadi definisi. Aturan yang melarang nama typedef jadi formal parameter membuat compiler selalu bisa memastikan apakah ia sedang memproses deklarasi atau definisi, cukup dengan melihat identifier pertama sesudah nama fungsi.
Typedef juga berharga saat kita hendak mendeklarasikan sesuatu yang sintaksnya menyiksa, semisal ‘array sepuluh pointer ke array lima integer’, yang bikin panik bahkan orang yang sudah terlatih. Menyembunyikannya di balik typedef berarti Anda cukup membacanya sekali, sekaligus bisa memecahnya jadi potongan yang lebih mudah dicerna:
typedef int (*a10ptoa5i[10])[5]; /* or */ typedef int a5i[5]; typedef a5i *atenptoa5i[10];
Coba sendiri!
Sumber: The C Book – Typedef
versi bahasa Inggris: https://home.wordpress.com/2006/03/28/typedef/
$ cd ~/