On Tuesday 15 November 2005 10:29 am, Rachman Chavik wrote:
> Daniel Baktiar wrote:
> > intinya macro ini dapat digunakan untuk menyederhanakan penulisan --
> > tidak berhubungan dengan isu efisiensi.
> > tetapi ada juga kekurangannya, karena dengan menggunakan macro lebih
> > sulit untuk melakukan debugging jika menggunakan step / breakpoint,
>
> Betul.  Selain itu side effects-nya perlu diperhatikan. Contoh:
>
> #define MYMACRO(a, b) a + a * b
>
> int main()
> {
>
>         printf("Result: %d\n", MYMACRO( 5   , 3) );
>         printf("Result: %d\n", MYMACRO( 2+3 , 3) );
> }
>
> Yang pertama hasil-nya: 20. printf kedua hasilnya 16.
> Kenapa?
>
> Coba lihat statement yang di-generate oleh preprocessor dengan:
>       gcc -E filename.c
>
> # 1 "a.c"
> # 1 "<built-in>"
> # 1 "<command line>"
> # 1 "a.c"
>
>
> int main()
> {
>
>         printf("Result: %d\n", 5 + 5 * 3 );
>         printf("Result: %d\n", 2+3 + 2+3 * 3 );
> }

Betul... karena itulah, untuk penggunaan aritmatika, disarankan macro 
menggunakan tanda kurung sebanyak mungkin... sehingga, sebaiknya penggunaan 
macro MYMACRO diatas seharusnya:

#define MYMACRO(a, b) ((a) + (a) * (b))

tapi sekali lagi... memang penggunaan macro harus sangat hati2 dan jika 
digunakan dengan benar, dapat mempermudah programming... selain itu jika 
diperlukan 'speed over size'...

> > karena tidak jelas bagian source code mana yang menghasilkan breakpoint
> > (pada hasil kompilasi macro telah di-expand, sedang pada source code
> > tidak). jadi macro sebaiknya digunakan untuk mempermudah pembacaan dan
> > untuk portabilitas (digabungkan preprocessor dengan #ifdef / #define /
> > #undef / etc.), tetapi jangan over-use.
>
> Setuju.  Reading-nya juga bisa lebih sulit.

Satu2nya cara untuk men-debug macro adalah dengan melakukan pre-process 
(menggunakan option -E pada GCC) dan melihat hasil preprocess... memang cukup 
menyusahkan....

> Tetapi, macro merupakan suatu tool yang sangat berguna jika digunakan
> secara hati-hati.

Betul! cocok untuk advanced...

-- 
Danny Kurniawan
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS/CM/E/IT d+() s+:+ a- C++>+++$ UL+++(++)>++++ P!(+++) L+++>++++>$ E-- W++>$
N o-- K- w--(+++) O++@ M@ V? PS PE-@ Y+ PGP@ t++ 5+@ X+++(++) R tv+ b
+++(++) DI? D++@ G+>++ e++ h- r++ y z- 
------END GEEK CODE BLOCK------

-- 
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis

Kirim email ke