Menu

Konstanta di C: const, #define, dan enum

Tiga cara memberi nama pada nilai yang tidak pernah berubah di C, yaitu kata kunci const, macro #define, dan konstanta enum: apa sebenarnya masing-masing, dan kapan memakainya.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Konstanta adalah nilai yang punya nama dan janji bahwa nilainya tidak akan berubah. C memberimu tiga mekanisme untuk itu, dan ketiganya benar-benar berbeda di balik layar: satu adalah variabel, satu penggantian teks, dan satu lagi tipe integer.

Kenapa Nilai Perlu Diberi Nama

Bandingkan dua baris ini:

double area = 3.14159 * r * r;
double area = PI * r * r;

Baris kedua lebih baik karena tiga alasan yang semuanya akan terasa nanti. Ia menyatakan arti angkanya. Ia muncul di tepat satu tempat, jadi mengubah presisinya cukup satu kali edit, bukan pencarian. Dan salah ketik di PI adalah error kompilasi, sedangkan salah ketik di 3.14195 adalah jawaban yang salah.

Angka tanpa nama yang tersebar di dalam kode disebut magic number, dan menghilangkannya adalah salah satu perbaikan paling murah yang bisa kamu lakukan pada program C.

const

Kata kunci const menandai sebuah variabel sebagai hanya-baca:

Hapus tanda komentar pada assignment itu dan compiler menolak: assignment of read-only variable 'PI'. Error saat build itulah intinya.

Variabel const adalah variabel sungguhan. Ia punya tipe, sehingga compiler memeriksa cara kamu memakainya. Ia mengikuti scope, jadi const di dalam fungsi tidak bocor ke luar. Ia punya alamat, jadi kamu bisa membuat pointer ke sana. Dan debugger bisa menampilkan nama dan nilainya.

const harus diinisialisasi di tempat deklarasi, tidak ada kesempatan kedua:

const int limit;       /* error (or garbage forever): nothing can assign to it later */
const int limit = 50;  /* correct */

#define

Alternatif dari preprocessor adalah macro:

Ini bukan variabel. Sebelum compiler berjalan, preprocessor mengganti setiap kemunculan PI di kode sumber dengan karakter 3.14159265358979. Compiler sama sekali tidak pernah melihat namanya, dan justru karena itulah #define tidak punya tipe dan tidak bisa muncul di debugger.

Perhatikan bahwa tidak ada titik koma dan tidak ada =. Macro adalah teks mentah, jadi kesalahan umum ini:

#define MAX_USERS 100;        /* note the semicolon */

int limit = MAX_USERS + 1;    /* expands to: int limit = 100; + 1;  -> error */

menghasilkan error di baris yang sama sekali tidak mirip dengan definisinya. Konvensi penamaan huruf besar untuk macro ada justru agar pembaca tahu ada penggantian teks yang terjadi.

Macro biasanya ditulis dalam UPPER_CASE; variabel const biasanya juga mengikuti gaya ini kalau mewakili ide yang sama.

Konstanta Enum

Bentuk ketiga memberimu sekumpulan integer bernama:

Nilainya dimulai dari 0 dan bertambah satu kecuali kamu menetapkannya, jadi MON bernilai 0 dan FRI bernilai 4. enum { ... } tanpa nama adalah pola umum untuk konstanta integer biasa.

Konstanta enum punya kelebihan nyata dibanding kedua alternatif lainnya: keduanya adalah konstanta integer saat kompilasi yang dipahami compiler, dan terlihat di debugger. Penjelasan lengkapnya ada di enum di C.

Mana yang Dipakai

KebutuhanGunakan
Konstanta yang bertipe, punya scope, dan bisa di-debugconst
Ukuran array, label case, lebar bitfieldenum atau #define
Konstanta string#define atau const char *
Konstanta floating-pointconst double
Sekumpulan nilai integer yang saling berkaitanenum
Apa pun yang harus dilihat preprocessor (#if, include guard)#define

Pilihan default sebaiknya const. Gunakan #define kalau nilainya harus sudah ada sebelum kompilasi, dan enum kalau kamu butuh integer saat kompilasi atau sekelompok nilai bernama.

Satu tempat di mana hal ini benar-benar terasa adalah ukuran array:

const int di C adalah variabel hanya-baca, bukan ekspresi konstan saat kompilasi. Di dalam fungsi, C99 menerima int local[const_size] dengan menjadikannya variable-length array; di file scope, di dalam struct, atau sebagai label case, kode itu langsung ditolak. enum dan #define bisa dipakai di mana saja.

(Ini salah satu perbedaan nyata dari C++, di mana const int adalah ekspresi konstan. Kode yang dipindah antara kedua bahasa itu sering tersandung di sini.)

const dengan Pointer

const dan pointer bisa digabung dengan tiga cara, dan artinya tidak bisa saling dipertukarkan. Baca deklarasinya dari nama ke arah luar:

const char *p;          /* p points at chars that must not be modified */
char * const q;         /* q itself cannot be re-pointed; the chars can change */
const char * const r;   /* neither the pointer nor the chars can change */

Bentuk const char * adalah yang paling sering akan kamu tulis, karena itulah tipe yang tepat untuk parameter fungsi yang membaca string tanpa mengubahnya:

Menambahkan const pada parameter yang hanya dibaca tidak ada biayanya dan mendokumentasikan kontraknya dengan cara yang ditegakkan compiler. Layak dilakukan di mana saja.

String Literal Pada Dasarnya const

Jebakan halus yang memang ingin ditangkap oleh const:

char *s = "hello";   /* legal C, but s points into read-only memory */
s[0] = 'H';          /* undefined behavior - usually a crash */

String literal disimpan di bagian executable yang hanya-baca. Menulis lewat pointer itu biasanya berujung segfault. Mendeklarasikan pointer-nya sebagai const char *s = "hello"; membuat compiler menolak assignment itu, alih-alih membiarkannya crash saat program berjalan.

Kalau kamu butuh string yang bisa diubah, salin ke sebuah array:

Pertanyaan yang sering diajukan

Bagaimana cara mendeklarasikan konstanta di C?

Tambahkan const pada deklarasi dan beri nilai: const double PI = 3.14159;. Compiler lalu menolak setiap upaya meng-assign nilai baru ke sana. Alternatif yang lebih lama adalah macro preprocessor, #define PI 3.14159, yang melakukan penggantian teks.

Apa perbedaan const dan #define di C?

const membuat variabel sungguhan bertipe yang dikenal compiler, sehingga tipenya diperiksa, muncul di debugger, dan mengikuti scope. #define murni penggantian teks yang dilakukan sebelum kompilasi: tidak punya tipe, tidak punya scope, dan tidak bisa diperiksa saat debugging. Utamakan const, kecuali kamu butuh nilainya di konteks yang mewajibkan konstanta saat kompilasi.

Apakah variabel const bisa dipakai sebagai ukuran array di C?

Tidak untuk array berukuran tetap di file scope. const int N = 10; int arr[N]; adalah variable-length array di C99 (boleh di dalam fungsi, tidak boleh di file scope, dan tidak boleh di struct). Untuk ukuran yang benar-benar konstan saat kompilasi, gunakan #define N 10 atau enum { N = 10 };.

Apa arti const char *p?

Itu pointer ke char yang konstan: kamu boleh mengubah ke mana p menunjuk, tetapi tidak boleh mengubah karakter yang ditunjuknya. char * const p adalah kebalikannya: pointer konstan ke char yang bisa diubah. const char * const p mengunci keduanya. Baca deklarasinya dari nama ke arah luar.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai