Definisi Macro

May 21, 2016 9:27 AM

`7MMM.     ,MMF'                                
  MMMb    dPMM                                  
  M YM   ,M MM   ,6"Yb.  ,p6"bo `7Mb,od8 ,pW"Wq.
  M  Mb  M' MM  8)   MM 6M'  OO   MM' "'6W'   `Wb
  M  YM.P'  MM   ,pm9MM 8M        MM    8M     M8
  M  `YM'   MM  8M   MM YM.    ,  MM    YA.   ,A9
.JML. `'  .JMML.`Moo9^Yo.YMbmd' .JMML.   `Ybmd9'

Macro mirip dengan fungsi. Namun dari segi waktu, macro diproses lebih cepat dari fungsi. Macro menggunakan #define dalam mendefinisikan konstanta dan membutuhkan input. Data input akan diproses dengan cepat, karena penulisannya pun juga lebih sederhana dari pada fungsi. Macro meliputi dua macam, yaitu macro dengan parameter dan macro tanpa parameter.



Macro tanpa parameter seperti yang telah dijelaskan di sub bab sebelumnya tentang #define. Macro dengan parameter dapat ditulis dengan format berikut: #define nama_macro(param1, param2,….param_N) runtutan_pemrosesan Contoh: #define tambah(a, b) (a + b) #define kurang(a, b) (a – b) Baris kode di atas adalah macro yang membutuhkan 2 masukan nilai untuk a dan b. Kemudian macro akan memproses a dan b, dan menghasilkan nilai dari hasil perhitungan keduanya. Di dalam mendefinisikan parameter tidak perlu menggunakan tipe data.

Contoh eksekusi:

int angka1 = 10, angka2 = 15;
int hasil_1, hasil_2;

hasil_1 = tambah (angka1, angka2);
hasil_2 = kurang (angka2, angka1);

Sesuai dengan sifat #define yang me-replace nilai, maka proses sebenarnya adalah:

hasil_1 = 10+15;
hasil_2 = 15-10;

Macro di atas menghasilkan nilai yang sama dengan fungsi di bawah ini.

int tambah (int a, int b) { return (a + b); }
int kurang (int a, int b) { return (a – b); }

Namun dengan macro perhitungan di atas akan diproses lebih cepat dan efisien. Apalagi kalau perhitungan yang lebih kompleks seperti di bawah ini.

#define get__ch (x, y, z) (((x < ‘e’) && (x < ‘a’)) ? (x | y) : (x ^ z))
Contoh macro di atas akan menghasilkan nilai yang sama dengan fungsi di bawah ini.

int get__ch (int x, int y, int z) {
int e = ‘e’;
int a = ‘a’; if ((x < e) && (x > a)) { x | y; }else { x ^ z; }
}

Contoh berikut menggambarkan perbedaan antara fungsi dengan macro, tidak hanya dari segi kecepatan, tetapi juga dari segi representasi nilai akan ada perberbedaan.

/**
** bab1_5.c
** test macro
**
** suwardi 2008
**/
#include
/* macro */
#define TEST_MACRO(a) ((a)*(a))
/* fungsi */

int test_macro (a) int a; { return ((a) * (a)); }
int main (argc, argv)
int argc; char **argv;
{
int a = 10, b, c; b = test_macro (a++);
printf (“Test dengan fungsi, nilai a terakhir = %d\n”, a);
printf (“Hasil : %d\n”, b); a = 10; c = TEST_MACRO(a++);
printf (“Test dengan macro, nilai a terakhir = %d\n”, a);
printf (“Hasil : %d\n”, c); return 0x0;
}

kompilasi:

% cc bab1_5.c -o bab1_5
% ./bab1_5 Test dengan fungsi, nilai a terakhir = 11 Hasil : 100

Test dengan macro, nilai a terakhir = 12 Hasil : 100


Contoh sederhana di atas cukup menggambarkan perbedaan antara macro dengan fungsi. Di dalam eksekusi fungsi nilai argument fungsi untuk (a++) yaitu 11 tetap dipertahankan sampai akhir eksekusi fungsi. Namun ini berbeda dengan eksekusi macro yang terus meningkatkan nilai a, dengan penambahan otomatis.

#define TEST_MACRO(a) ((a)*(a)) … a = 10; c = TEST_MACRO(a++);

menjadi: a = 10; c = ((a++) * (a++));

Namun dengan adanya perbedaan nilai di penambahan variabel a, tidak memberikan efek pada hasil akhir variabel c. Argumen di dalam macro dapat dikonversikan ke string dengan operator ‘#’. Ini akan berguna ketika mencetak output ke stream. Caranya hanya dengan menambahkan tanda # diikuti dengan nama argumen macro.

#define HELL_EXEC(fire) \ printf (“The term of #fire is a string.”) … HELL_EXEC(A and B);

Macro Variadic adalah macro yang memiliki sejumlah argumen. Argumen-argumen itu direpresentasikan ke dalam tiga buah titik. Kesemua titik itu tersimpan dalam sebuah koma pemisah argumen dan argumen berupa tiga titik itu nantinya akan direplace oleh variabel yang bernama __VA_ARGS__. Variabel inilah yang akan memperlebar macro. Contoh macronya sebagai berikut:


#define err_mesg(…) fprintf(stderr, __VA_ARGS__)

err_mesg(“There was an error in %s %d\n”, “Error Code: “, 48);

Output yang dikeluarkan oloeh preprosessor setelah pemrosessan menjadi seperti berikut ini.

fprintf (stderr, “%s %d\n”, “Error Code: “, 48);

Berikut ini contoh variadic macro yang dapat menyertakan parameter, macro ini memiliki dua buah argumen namun dapat diikuti oleh beberapa variabel.


#define error(a,b, …) \
fprintf(stderr, “File %s, Line %d: “, a, b); \ fprintf(stderr, __VA_ARGS__) …


/* Cara penggunaan macro error() */
error(__FILE__, __LINE__, “This is known file and line error.\n”);

Macro-macro seperti __FILE__ dan __LINE__ adalah macro yang efektif untuk menunjukkan error yang terjadi. Ada satu macro lagi yang mendukung kegunaan macro __FILE__ dan __LINE__, yaitu macro __func__.

Ketiga macro itu bisa saling terkait. Jika menulis ketiga macro itu kedalam sebuah fungsi, maka pesan error akan dilaporkan sebagaimana yang terjadi di fungsi tersebut. Berikut salah satu cara untuk mendefinisikan sebuah macro yang berisi ketiga macro tersebut.


/* definisi */

#define message(messg_here) \
fprintf(stderr, “File: %s Line: %d Function: %s\n%s\n”, \
__FILE__, __LINE__, __func__, messg_here) …


/* penggunaan */
message(“Error message of this function here…\n”);


#EOF

1 comments:

Anonymous said...

Woww

Article list :