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