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

Kirim email ke