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