Pernahkah anda mendengar preprocessor?? Processor itu artinya pemroses, sedang pre artinya sebelum. Jadi preprocessor adalah PROSES AWAL sebelum mengeksekusi kode program kita :P
Nah, apakah yang di proses oleh prosessor pada “PROSES AWAL” sebelum processor ini memproses kode kita line per line?
Yup, processor akan melakukan ekspedisi apakah ada perintah awal sebelum memulai eksekusi kode kita. Perintah – perintah awal ini dinamakan dengan “PREPROCESSOR DIRECTIVES”.
Kesimpulannya:
Preprocessor directive merupakan sebuah baris kode perintah untuk preprocessor. Baris kode ini bukan merupakan kode statement, tetapi baris perintah untuk preprocessor sebelum mengeksekusi kode program.
Perintah ini (Directives) selalu diawali dengan tanda hash (#) dan hanya satu line saja. Boleh memakai “ ; “ boleh tidak. Untuk pengguna Visual Studio bisa menggunakan “ ; “ bisa tidak, tapi mungkin pengguna Compiler lain tidak diizinkan menggunakan “ ; “. Perintah baris dengan tanda # inilah yang akan dikerjakan terlebih dahulu sebelum memroses/mengeksekusi kode kita.
Sebetulnya preprocessor directive ini bisa kok lebih dari satu line asalkan ditambahkan backslash di bagian akhir line ( \ ).
Banyak sekali jenis – jenis dari PREPROCESSOR DIRECTIVES ini, diantaranya adalah sebagai berikut:
A.Macro Definitions
Untuk pendefinisian preprocessor macro, kita dapat menggunakan :
#define [identifiernya] [penggantinya]
#undef [identifiernya]
Contoh:
#define TABLE_SIZE 100
#define JUMLAH 35
Nah, pada contoh di atas, identifier adalah TABLE_SIZE, pengganti adalah 100. Begitu juga dengan contoh kedua.
[penggantinya] ini bisa berupa apa aja, bisa berupa expression, bisa berupa statement, block, dan lain – lain, apa saja.
Preprocessor ini tidak menghiraukan bahkan tidak memahami C++ , sehingga apapun yang digunakan sebagai [penggantinya] akan dilakukan.
Lihat gambar 1:
Pada contoh anda bisa lihat, apapun yang saya lakukan terhadap TABLE_SIZE, maka hasilnya adalah 100, karena saya telah mendefinisikan bahwa TABLE_SIZE adalah 100.
Mudah bukan??? Nah, sekarang mari kita hapus definisi terhadap TABLE_SIZE ini, caranya adalah dengan menggunakan #undef.
#undef digunakan untuk menghapus definisi untuk [identifier].
#undef TABLE_SIZE
Lihat gambar 2:
Pada kode di atas, kita menghilangkan definisi terhadap TABLE_SIZE, kemudian mendefinisikan kembali dengan [pengganti] berbeda.
Mudah dipahami bukan??
Nah, tadi di awal, kita mengatakan bahwa [penggantinya] ini bisa berupa apa aja. Bisakah berupa seperti function? Bisa, contohnya:
#define getMax(a,b) (a>b?a:b)
Kita mendefinisikan, apapun kode yang terdapat dalam kodeline kita, bila kode tersebut berupa getMax(a,b) maka akan digantikan dengan (a>b?a:b).
Sebentar dulu, bisakah anda membaca (a>b?a:b) ??
Bacanya adalah “bila a lebih besar dari b, maka return nilai a, yang lain return nilai b”.
Lihat gambar 3:
Hasilnya adalah 5.
Nah, pada kode di atas, semua kode yang mengandung getMax() akan digantikan oleh [penggantinya].
Macro definition ini memiliki dua operator khusus yaitu hash (#) dan double hash (##).
Bila # digunakan di depan [penggantinya] maka akan di convert menjadi string.
Lihat contoh:
#define embuh(x) #x
cout << embuh(hem);
Maka, akan menghasilkan:
cout << “hem”;
Sementara itu, operator ## digunakan untuk menggabungkan dua argument, contoh:
#define gabung(a,b) a ## b
gabung(c,out) << ”test”;
akan menghasilkan:
cout << ”test”;
Mudah bukan??
B.Conditional Inclusion
Namanya juga conditional, pasti berhubungan dengan if else :)
Directives yang digunakan untuk conditional diantaranya adalah sebagai berikut:
#ifdef , #ifndef , #if !define , #if , #endif , #else , #elif
Coba perhatikan contoh kode ini:
#ifdef TABLE_SIZE
a = TABLE_SIZE;
#endif
Artinya bila TABLE_SIZE telah didefinisikan, maka nilai a adalah TABLE_SIZE. Mudah kan?
Kode di atas, sama dengan kode berikut ini:
#if !define TABLE_SIZE
a = TABLE_SIZE;
#endif
Nah, bagaimana kalo kita lengkapi kodenya jadi seperti ini:
#ifdef TABLE_SIZE
a = TABLE_SIZE;
#else
a = 10;
#endif
nah, kalo kode ini ada elsenya, yaitu bila TABLE_SIZE didefinisikan, maka nilai a adalah TABLE_SIZE, bila belum didefinisikan maka nilai a adalah 10.
Kita akan mencoba lagi:
#ifdef TABLE_SIZE
a = TABLE_SIZE;
#elif TABLE_SIZE > 200;
a = 10;
#else
a = TABLE_SIZE
#endif
Mudah bukan membacanya?
Bila TABLE_SIZE telah didefinisikan, maka nilai a adalah TABLE_SIZE, bila nilai TABLE_SIZE lebih besar dari 200 maka nilai a diberikan 10 saja, yang lain maka nilai a sama dengan TABLE_SIZE.
C.Line Control
Digunakan untuk men-display line number dari kode kita. Sintaks nya adalah:
#line [number] [filename]
Contoh:
#line 20 “ini cuman contoh”
Int a?; //ini iseng doang
Coba debug, pasti ada konfirmasi ERROR::“line 20, ini cuman contoh”. :)
Sangat cocok sekali buat anda yang mungkin ingin men-track kode anda.
D.Error Directive
Digunakan untuk meng-alert / men-display alert sesuai dengan yang kita inginkan.
Sintaks:
#error [message]
contoh:
#ifndef TABLE_SIZE
#error Wah, bro, TABLE_SIZE belum didefinisikan nuh, coba check lagi
#endif
E.Source File Inclusion
Kalo yang ini sering sekali kita gunakan. Sintaksnya adalah sebagai berikut:
#include
#include “namafile”
Perbedaan pada keduanya adalah tempat / directori / folder dimana compiler akan mencari [namafile].
Untuk penggunaan di antara angle-bracket ( <> ), maka compiler akan mencari [namafile] langsung pada directory default C++ standard header file.
Sedangkan untuk penggunaan di antara quote ( “ ” ), maka compiler akan mencari [namafile] pada directory yang sama dengan file .cpp yang ada directives nya, bila tidak ditemukan, baru akan mencari ke standar directory default header file.
F.Pragma Directive
Setiap compiler memiliki opsi / fasilitas tersendiri yang berbeda dengan lainnya. Opsi khusus ini bisa didefinisikan melalui pragma.
Coba check saja compiler anda, kira kira apa saja yang dapat didefinisikan dalam pragma ini.
G.Predefined Macro
Selain dengan define ( # ) , ternyata ada juga yang predefined. Nah, predifined macro ini dapat didefinisikan kapan saja.
Berikut merupakan predefined macro:
a.__LINE__ : Berupa integer dari nilai baris kode yang sedang dicompile.
b.__FILE__ : Merupakan nama file kode yang sedang dicompile.
c.__DATE__ : Berisikan tanggal (Mmm dd yyyy) saat file yang bersangkutan dicompile.
d.__TIME__ : Berisikan waktu (hh:mm:ss) saat file yang bersangkutan dicompile.
e.__cplusplus : Berupa integer value. Semua C++ compiler memiliki nilai konstan sendiri – sendiri untuk predefine ini.
Lihat gambar 4:
Hasil dari kode di atas adalah seperti berikut ini,
Lihat gambar 5:
Di atas merupakan contoh penerapan predefined macro.
Akhirnya sekian tutorial dari MediaTutorial kali ini, semoga bermanfaat.
Salam.
Sebetulnya preprocessor directive ini bisa kok lebih dari satu line asalkan ditambahkan backslash di bagian akhir line ( \ ).
Banyak sekali jenis – jenis dari PREPROCESSOR DIRECTIVES ini, diantaranya adalah sebagai berikut:
A.Macro Definitions
Untuk pendefinisian preprocessor macro, kita dapat menggunakan :
#define [identifiernya] [penggantinya]
#undef [identifiernya]
Contoh:
#define TABLE_SIZE 100
#define JUMLAH 35
Nah, pada contoh di atas, identifier adalah TABLE_SIZE, pengganti adalah 100. Begitu juga dengan contoh kedua.
[penggantinya] ini bisa berupa apa aja, bisa berupa expression, bisa berupa statement, block, dan lain – lain, apa saja.
Preprocessor ini tidak menghiraukan bahkan tidak memahami C++ , sehingga apapun yang digunakan sebagai [penggantinya] akan dilakukan.
Lihat gambar 1:
Pada contoh anda bisa lihat, apapun yang saya lakukan terhadap TABLE_SIZE, maka hasilnya adalah 100, karena saya telah mendefinisikan bahwa TABLE_SIZE adalah 100.
Mudah bukan??? Nah, sekarang mari kita hapus definisi terhadap TABLE_SIZE ini, caranya adalah dengan menggunakan #undef.
#undef digunakan untuk menghapus definisi untuk [identifier].
#undef TABLE_SIZE
Lihat gambar 2:
Pada kode di atas, kita menghilangkan definisi terhadap TABLE_SIZE, kemudian mendefinisikan kembali dengan [pengganti] berbeda.
Mudah dipahami bukan??
Nah, tadi di awal, kita mengatakan bahwa [penggantinya] ini bisa berupa apa aja. Bisakah berupa seperti function? Bisa, contohnya:
#define getMax(a,b) (a>b?a:b)
Kita mendefinisikan, apapun kode yang terdapat dalam kodeline kita, bila kode tersebut berupa getMax(a,b) maka akan digantikan dengan (a>b?a:b).
Sebentar dulu, bisakah anda membaca (a>b?a:b) ??
Bacanya adalah “bila a lebih besar dari b, maka return nilai a, yang lain return nilai b”.
Lihat gambar 3:
Hasilnya adalah 5.
Nah, pada kode di atas, semua kode yang mengandung getMax() akan digantikan oleh [penggantinya].
Macro definition ini memiliki dua operator khusus yaitu hash (#) dan double hash (##).
Bila # digunakan di depan [penggantinya] maka akan di convert menjadi string.
Lihat contoh:
#define embuh(x) #x
cout << embuh(hem);
Maka, akan menghasilkan:
cout << “hem”;
Sementara itu, operator ## digunakan untuk menggabungkan dua argument, contoh:
#define gabung(a,b) a ## b
gabung(c,out) << ”test”;
akan menghasilkan:
cout << ”test”;
Mudah bukan??
B.Conditional Inclusion
Namanya juga conditional, pasti berhubungan dengan if else :)
Directives yang digunakan untuk conditional diantaranya adalah sebagai berikut:
#ifdef , #ifndef , #if !define , #if , #endif , #else , #elif
Coba perhatikan contoh kode ini:
#ifdef TABLE_SIZE
a = TABLE_SIZE;
#endif
Artinya bila TABLE_SIZE telah didefinisikan, maka nilai a adalah TABLE_SIZE. Mudah kan?
Kode di atas, sama dengan kode berikut ini:
#if !define TABLE_SIZE
a = TABLE_SIZE;
#endif
Nah, bagaimana kalo kita lengkapi kodenya jadi seperti ini:
#ifdef TABLE_SIZE
a = TABLE_SIZE;
#else
a = 10;
#endif
nah, kalo kode ini ada elsenya, yaitu bila TABLE_SIZE didefinisikan, maka nilai a adalah TABLE_SIZE, bila belum didefinisikan maka nilai a adalah 10.
Kita akan mencoba lagi:
#ifdef TABLE_SIZE
a = TABLE_SIZE;
#elif TABLE_SIZE > 200;
a = 10;
#else
a = TABLE_SIZE
#endif
Mudah bukan membacanya?
Bila TABLE_SIZE telah didefinisikan, maka nilai a adalah TABLE_SIZE, bila nilai TABLE_SIZE lebih besar dari 200 maka nilai a diberikan 10 saja, yang lain maka nilai a sama dengan TABLE_SIZE.
C.Line Control
Digunakan untuk men-display line number dari kode kita. Sintaks nya adalah:
#line [number] [filename]
Contoh:
#line 20 “ini cuman contoh”
Int a?; //ini iseng doang
Coba debug, pasti ada konfirmasi ERROR::“line 20, ini cuman contoh”. :)
Sangat cocok sekali buat anda yang mungkin ingin men-track kode anda.
D.Error Directive
Digunakan untuk meng-alert / men-display alert sesuai dengan yang kita inginkan.
Sintaks:
#error [message]
contoh:
#ifndef TABLE_SIZE
#error Wah, bro, TABLE_SIZE belum didefinisikan nuh, coba check lagi
#endif
E.Source File Inclusion
Kalo yang ini sering sekali kita gunakan. Sintaksnya adalah sebagai berikut:
#include
#include “namafile”
Perbedaan pada keduanya adalah tempat / directori / folder dimana compiler akan mencari [namafile].
Untuk penggunaan di antara angle-bracket ( <> ), maka compiler akan mencari [namafile] langsung pada directory default C++ standard header file.
Sedangkan untuk penggunaan di antara quote ( “ ” ), maka compiler akan mencari [namafile] pada directory yang sama dengan file .cpp yang ada directives nya, bila tidak ditemukan, baru akan mencari ke standar directory default header file.
F.Pragma Directive
Setiap compiler memiliki opsi / fasilitas tersendiri yang berbeda dengan lainnya. Opsi khusus ini bisa didefinisikan melalui pragma.
Coba check saja compiler anda, kira kira apa saja yang dapat didefinisikan dalam pragma ini.
G.Predefined Macro
Selain dengan define ( # ) , ternyata ada juga yang predefined. Nah, predifined macro ini dapat didefinisikan kapan saja.
Berikut merupakan predefined macro:
a.__LINE__ : Berupa integer dari nilai baris kode yang sedang dicompile.
b.__FILE__ : Merupakan nama file kode yang sedang dicompile.
c.__DATE__ : Berisikan tanggal (Mmm dd yyyy) saat file yang bersangkutan dicompile.
d.__TIME__ : Berisikan waktu (hh:mm:ss) saat file yang bersangkutan dicompile.
e.__cplusplus : Berupa integer value. Semua C++ compiler memiliki nilai konstan sendiri – sendiri untuk predefine ini.
Lihat gambar 4:
Hasil dari kode di atas adalah seperti berikut ini,
Lihat gambar 5:
Di atas merupakan contoh penerapan predefined macro.
Akhirnya sekian tutorial dari MediaTutorial kali ini, semoga bermanfaat.
Salam.