Pemrograman C-4

MAKRO DAN KONSTANTA

Sebuah program C apabila dikompilasi untuk dijadikan executable file, maka instruksi pertama yang akan dijalankan adalah praprosesor atau pemrosesan awal. Fungsi dari praprosesor adalah untuk menyertakan file-file header yang telah ditentukan dan untuk mengekspansi makro dan konstanta. Sebelum compiler benar-benar mulai mengkompilasi program, praprosesor akan memperhatikan atau bertanggung jawab untuk mengerjakan #define, #include dan pernyataan-pernyataan # lainnya..

4.1.Konstanta

Untuk meningkatkan kemudahan program dalam pembacaan dan meningkatkan efisiensi program, maka program dapat mengganti referensi-referensi yang berupa suatu angka dengan suatu nama konstanta yang lebih memiliki arti. Sebuah konstanta adalah suatu nama yang oleh compiler C akan diasosiasikan sebagai sebuah bilangan yang besarnya tidak berubah. Untuk membuat sebuah konstanta, dapat dilakukan dengan mendefinisikan melalui cara  penulisan #define ditambah nama dan nilai dari konstanta tersebut seperti contoh dibawah ini.

#define UKURAN_BARIS 128

Apabila pada pemrosesan awal compiler C menjumpai nama konstanta tersebut, maka akan diganti nama konstanta tersebut dengan nilai yan ditunjukkan oleh pengarah praprosesornya sebagai contoh seperti dibawah ini.

char baris[128];

char teks[128];

 

char baris_sekarang[UKURAN_BARIS];

char masukan_pemakai[UKURAN_BARIS];

 

Kedua deklarasi yang pertama menciptakan string-string karakter yang berisi string karakter 128 byte. Kedua deklarasi yang kedua membuat string-string karakter yang berdasarkan suatu konstanta bernama UKURAN_BARIS. Apabila pemrogram lain membaca kode program tersebut, salah satu dari pertanyaan yang mungkin ditanyakan adalah penyebab penggunaan 128 sebagai pendeklarasian string. Akan tetapi pada kasus pendeklarasian yang kedua, pemrogram tersebut akan tahu bahwa semua string dalam program dideklarasikan terhadap UKURAN_BARIS yang sudah tertentu. Bahkan dalam program boleh dimasukkan kalang yang serupa dengan berikut ini.

for (i = 0; i < 128; i++)

// Pernyataan-pernyataan

for(i = 0; i < UKURAN_BARIS; i++)

// Pernyataan-pernyataan;

 

Cara ini tidak hanya membuat kalang for yang kedua menjadi lebih mudah dibaca, akan tetapi juga menjadi perubahan program pada masa yang akan datang akan lebih mudah. Sebagai contoh apabila pada suatu saat dikehendaki mengubah ukurannya menjadi 256 karakter, maka apabila tanpa menggunakan #define, kita harus merubah semua yang bernilai 128, akan tetapi apabila dengan menggunakan #define, maka cukup dengan mengganti nilai pada #define tersebut.. Untuk memahami penggunaan #define yang mendefinisikan suatu konstanta di dalam program tersebut cobalah program kecil berikut ini.

LATIHAN 5.1

#define LINE 128

#define TITLE “Pemrograman C”

#define SECTION “Makro”

void main (void)

{

char book[LINE];

char library_name[LINE];

printf(“ Mata Kuliah yang sedang dipelajari adalah %s\n, TITLE);

printf (SECTION)

}

 

Apabila program pendek tersebut dikompilasi, maka pertama yang akan dijalankan adalah praprosesor. Fungsi dari praprosesor  adalah menyertakan file-file header yang telah ditentukan dan untuk mengekspansi makro dan konstanta. Sebelum compiler C benar-benar mulai mengkompilasi program diatas. Praposesor tersebut akan mengganti setiap nama konstanta dengan nilai yang ditunjukkan pada pengarah praprosesor, sebagaimana diperlihatkan pada program di bawah ini.

void main (void)

{

char book[128];

char library_name[128];

printf(“ Mata Kuliah yang sedang dipelajari adalah %s\n, “Pemrograman C” );

printf (“Macros”)

}

Penggunaan konstanta dan makro di dalam program sebaiknya menggunakan nama-nama yang benar-benar menjelaskan kegunaannya  hal ini untuk memudahkan dalam penggunaan selanjutnya.

4.2.  Menghapus Defnisi Sebuah Makro atau Konstanta

Pada saat tertentu dikehendaki agar praprosesor dibuang atau didefinisikan ulang, sebagai contoh apabila dikehendaki pendefinisian ulang makro toupper yang telah didefinisikan pada file header ctype.h , maka dapat di coba dengan cara sebagai berikut :

#define _toupper (c) ((((c) >= ‘a’)  & ((c) <= ‘z’))? (c) – ‘a’ + ‘A’ : c)   

Apabila dikompilasi program tersebut, banyak praprosesor yang akan menampilkan pesan peringatan yang memberitahukan bahwa program telah mendefinisikan ulang makro tersebut, untuk mencegah timbulnya pesan peringatan ini, pertama-tama harus dihapuskan definisi dari makro tersebut terlebih dahulu dengan menggunakan pengarah praprosesor #undef, sebagaimana diperlihatkan dalam contoh berikut.

#undef _toupper

#define _toupper (c) ((((c) >= ‘a’)  && ((c) <= ‘z’)) ? (c) – ‘a’ + ‘A’ : c)   

4.3.  Pengarah Kompiler Pragma

Tergantung dari compiler yang digunakan, library praprosesor yang digunakan pada compiler tertentu mendukung pengarah compiler yang disebut pragma. Format dari penggunaan pengarah ini adalah sebagai berikut :

#pragma pengarah_kompiler   

Sebagai contoh compiler Borland C++ menyediakan pragma startup dan exit yang memungkinkan untuk menentukan fungsi yang dikehendaki untuk dieksekusi secara otomatis oleh program pada saat  dimulai atau berakhir : dengan format pengarah sebagai berikut :

#pragma startup load_data   

#pragma exit close_all_files   

4.4.  Pengarah Kompiler ifdef

Pada program tertentu adakalanya dikehendaki agar praprosesor menguji suatu simbul sudah didefinisikan atau belum, dan apabila sudah didefinisikan maka akan memproses serangkaian perintah tertentu. Untuk membantu program menguji suatu simbul sudah didefinisikan atau belum, praprosesor C menyediakan pengarah #ifdef, Format dari pengarah #ifdef ini adalah sebagai berikut :

#ifdef symbol

//pernyataan-pernyataan   

#endif   

Pada saat praprosesor menjumpai sebuah pengarah #ifdef, praprosesor tersebut akan menguji symbol tersebut sudah di definisikan atau belum, apabila sudah didefinisikan praprosesor akan memproses pernyataan-pernyataan yang mengikuti pengarah tersebut sampai ke #endif. Dengan cara yang sama, adakalanya diinginkan praprosesor memproses pernyataan-pernyataan bila symbol ternyata belum didefinisikan. Apabila demikian halnya, maka dapat menggunakan pengarah #ifndef. Pernyataan berikut ini menggunakan #ifndef untuk mengarahkan praprosesor untuk mendefinisikan makro toupper apabila makro tersebut belum didefinisikan

#ifndef _toupper

#define _toupper (c) ((((c) >= ‘a’)  && ((c) <= ‘z’)) ? (c) – ‘a’ + ‘A’ : c)   

#endif

Apabila dikehendaki pemrosesan dengan menyertakan serangkaian pernyataan agar dijalankan oleh praprosesor apabila kondisi diperiksa benar dan serangkaian pernyataan yang berbeda lagi apabila kondisi pengujinya salah, maka dapat digunakan pengarah #else seperti contoh berikut ini.

#ifndef  symbol

  // Pernyataan-pernyataan

#else

  //Pernyataan-pernyataan   

#endif

Seiring dengan semakin kompleksnya konstanta dan makro, adakalanya suatu definisi tidak cukup berada dalam satu baris. Pada saat diperlukan untuk meletakkan suatu definisi konstanta atau makro pada baris berikutnya , diperlukan sebuh karakter garis miring yang diletakkan pada akhir baris, sebagaimana diperlihatkan pada contoh dibawah ini.

#deine string_karakter_yang _sangat panjang “ini merupakan string yang memerlukan \ dua baris sehingga harus dikasih garis miring”

#define _toupper (c) ((((c) >= ‘a’)  && ((c) <= ‘z’)) \

? (c) – ‘a’ + ‘A’ : c)   

 

Makro juga memungkinkan programmer melakukan operasi yang mirip dengan fungsi yang bekerja dengan parameter (nilai-nilai yang dilewatkan ke makro tersebut). Untuk memahami pembuatan makro tersebut cobalah latihan program pendek berikut ini.

 

LATIHAN 5.2

#include <stdio.h>

#define SUM(x, y) ((x) + (y))

 

void main (void)

{

printf (“Adding 3 + 5 = %d\n”, SUM(3,5));

printf (“Adding 3.4 + 3.1 = %f\n”, SUM(3.4 ,3.1));

printf (“Adding -100 + 1000 = %d\n”, SUM(-100, 1000));

 

}

 

LATIHAN 5.3

#define MIN (x,y) (((x) < (y)) ? (x) : (y))

#define MAX (x,y) (((x) > (y)) ? (x) : (y))

 

void main (void)

{

printf (“Minimum of 3 and 5 is %d\n”, MIN(3,5));

printf (“Maximum of 3.4 and 3.1 is %f\n”, MAX(3,5, 3.1));

printf (“Minimum of -100 and 1000 is %d\n”, MIN(-100, 1000));

}

 

LATIHAN 5.4

#include <stdio.h>

#define SQUARE(x)  ((x) * (x))

#define CUBE(x)  ((x) * (x) *(x))

 

 

void main (void)

{

printf (“This square of 2 is %d\n”, SQUARE(2));

printf (“This cube of 100 is %f\n”, CUBE(100.0));

 

}

 

 

Leave a comment

No comments yet.

Comments RSS TrackBack Identifier URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s