On Tuesday 08 November 2005 08:01 pm, Arman Idris wrote: > Hi all, > > Saya baru mo belajar programming dilinux, trus coba2 baca source code > program (saya baca source code xmms) tapi ada beberapa yang mengganjal soal > macro mungkin ada diantara rekan2 yang bisa memberikan pencerahan. > > di file xmms.h saya dapat > > #ifndef XMMS_H > #define XMMS_H > > hampir dibanyak file header saya temukan seperti itu, dan misalnya > input.hbiasanya ada : > > #ifndef INPUT_H > #define INPUT_H
itu adalah 'code guard' yang diletakkan pada header file, tujuannya adalah mencegah supaya file header tidak sampai diinclude lebih dari 1 kali, hal tsb bisa terjadi misalnya: file y.h include x.h; sedangkan file z.h include x.h dan y.h... akibatnya kalau file z.h dicompile, bisa terjadi error karena file x.h diinclude 2x dalam z.h... makanya untuk mencegahnya digunakan trik untuk menandai apakah seluruh definisi dalam file header sudah di-definisikan atau belum dengan menggunakan compiler directive #define... selengkapnya 'code guard' seharusnya ditulis: #ifndef CONTOH_H #define CONTOH_H ... isi file header ... #endif di akhir file selalu ada #endif yang merupakan pasangan dari compiler directive #ifndef nah... umumnya key yang di-define menggunakan nama file dengan pola misal file contoh.h menggunakan key CONTOH_H... tapi sebenarnya apapun bisa, hanya sebagai kemudahan saja... ada juga yang menggunakan pola _NAMAFILE_H_ atau _NAMAFILE_H... whatever lah... untuk keterangan mengenai compiler directive bisa lihat ke buku manual gcc/g++ atau buku referensi C/C++ lainnya... > trus ada juga macro seperti ini: > > #ifdef __cplusplus > extern "C" { > #endif > > #ifdef __cplusplus > } > #endif > > sepertinya ini ada hubungannya c++. betul! tapi umumnya bergantung pada compiler... GCC menggunakan keyword __cplusplus untuk menandai apakah file tersebut dalam mode compile C++, soalnya mode compile antara C dan C++ ada perbedaan... perbedaan tersebut ada hubungannya dengan name mangling atau penggantian nama referensi sebuah function... di C tidak ada name mangling, sedangkan karena C++ memiliki function overloading, maka diperlukan name mangling... nah... fungsi extern "C" itu untuk memberitahu compiler bahwa jangan melakukan name mangling untuk fungsi2 tertentu jika dicompile pada mode C++, hal tersebut dapat menyebabkan salah referensi pada saat linking... > Ada juga #ifdef linux, #ifdef __FreeBSD__, #ifdef __hpux > kalau yang ini kemungkinan besar untuk sistem operasi, yang jadi pertanyaan > kenapa untuk linux cuma ditulis linux sedangkan hpux ada tambahan "__", > freebsd malah ada kombinasi huruf besar kecil. define-define tersebut memang spesifik untuk sistem operasi tertentu... biasanya ada hubungannya dengan include header file kernel... untuk penamaannya saya juga kurang tahu mengapa berbeda2... tapi karena hal tersebut spesifik, saya kira memang tidak ada hubungannya dengan compiler GCC, sehingga setiap vendor mungkin saja berbeda dalam memberikan penamaan key... > mohon maaf kalau pertanyaannya tidak bermutu, tapi saya sudah baca beberapa > referensi tidak pernah ada penjelasan yang memuaskan. sebenarnya banyak koq tutorial2 di internet... biasanya yang menjelaskan hal2 tersebut memang spesifik, kalo cari di referensi umum biasanya penjelasannya tidak terlalu mendetail.... -- 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