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