Preprocessor C++: Bagaimana Direktif Membentuk Kode Anda
Preprocessor adalah direktif, yang memberikan instruksi ke compiler untuk memproses informasi sebelum kompilasi sebenarnya dimulai.
Semua direktif preprocessor dimulai dengan #, dan hanya karakter spasi putih yang boleh muncul sebelum direktif preprocessor pada baris. Direktif preprocessor bukan pernyataan C++, jadi mereka tidak diakhiri dengan titik koma (;).
Anda sudah melihat direktif #include dalam semua contoh. Macro ini digunakan untuk menyertakan file header ke dalam file sumber.
Ada sejumlah direktif preprocessor yang didukung oleh C++ seperti #include, #define, #if, #else, #line, dll. Mari kita lihat direktif penting minus–
Preprocessor #define
Direktif preprocessor #define menciptakan konstanta simbolik. Konstanta simbolik disebut macro dan bentuk umum dari direktif adalah minus–
#define nama-makro teks-pengganti
Ketika baris ini muncul dalam file, semua kemunculan makro berikutnya dalam file tersebut akan diganti dengan teks-pengganti sebelum program dikompilasi. Contohnya minus–
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Nilai PI :" << PI << endl; return 0; }
Sekarang, mari kita lakukan preprocessing dari kode ini untuk melihat hasilnya asalkan kita memiliki file kode sumber. Jadi mari kita kompile dengan opsi -E dan alihkan hasilnya ke test.p. Sekarang, jika Anda memeriksa test.p, itu akan memiliki banyak informasi dan di bagian bawah, Anda akan menemukan nilai diganti sebagai berikut minus–
$gcc -E test.cpp > test.p ... int main () { cout << "Nilai PI :" << 3.14159 << endl; return 0; }
Macro Seperti Fungsi
Anda dapat menggunakan #define untuk mendefinisikan makro yang akan mengambil argumen sebagai berikut minus–
Live Demo
#include <iostream> using namespace std; #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; cout <<"Nilai minimum adalah " << MIN(i, j) << endl; return 0; }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
Nilai minimum adalah 30
Kompilasi Bersyarat
Ada beberapa direktif, yang dapat digunakan untuk mengompilasi bagian selektif dari kode sumber program Anda. Proses ini disebut kompilasi bersyarat.
Konstruk preprocessor bersyarat sangat mirip dengan struktur seleksi ‘if’. Pertimbangkan kode preprocessor berikut minus–
#ifndef NULL #define NULL 0 #endif
Anda dapat mengompilasi program untuk tujuan debugging. Anda juga dapat menyalakan atau mematikan debugging menggunakan satu makro sebagai berikut minus–
#ifdef DEBUG cerr <<"Variabel x = " << x << endl; #endif
Ini menyebabkan pernyataan cerr untuk dikompilasi dalam program jika konstanta simbolik DEBUG telah didefinisikan sebelum direktif #ifdef DEBUG. Anda dapat menggunakan #if 0 statment untuk mencopot bagian program sebagai berikut minus–
#if 0 kode yang dicegah untuk dikompilasi #endif
Mari kita coba contoh berikut minus–
Live Demo
#include <iostream> using namespace std; #define DEBUG #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; #ifdef DEBUG cerr <<"Trace: Di dalam fungsi main" << endl; #endif #if 0 /* Ini adalah bagian yang dicopot */ cout << MKSTR(HELLO C++) << endl; #endif cout <<"Nilai minimum adalah " << MIN(i, j) << endl; #ifdef DEBUG cerr <<"Trace: Keluar dari fungsi main" << endl; #endif return 0; }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
Nilai minimum adalah 30 Trace: Di dalam fungsi main Trace: Keluar dari fungsi main
Operator # dan ##
Operator # dan ## preprocessor tersedia dalam C++ dan ANSI/ISO C. Operator # menyebabkan token teks-pengganti dikonversi menjadi string yang dikelilingi tanda petik.
Pertimbangkan definisi makro berikut minus–
Live Demo
#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
HELLO C++
Mari kita lihat bagaimana cara kerjanya. Mudah dipahami bahwa preprocessor C++ mengubah baris minus–
cout << MKSTR(HELLO C++) << endl;
Baris di atas akan diubah menjadi baris berikut minus–
cout << "HELLO C++" << endl;
Operator ## digunakan untuk menggabungkan dua token. Berikut adalah contoh minus–
#define CONCAT( x, y ) x ## y
Ketika CONCAT muncul dalam program, argumennya digabungkan dan digunakan untuk menggantikan makro. Contohnya, CONCAT(HELLO, C++) digantikan oleh "HELLO C++" dalam program sebagai berikut.
Live Demo
#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { int xy = 100; cout << concat(x, y); return 0; }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
100
Mari kita lihat bagaimana cara kerjanya. Mudah dipahami bahwa preprocessor C++ mentransformasi minus–
cout << concat(x, y);
Baris di atas akan ditransformasikan menjadi baris berikut minus–
cout << xy;
Makro Bawaan C++
C++ menyediakan sejumlah makro bawaan yang disebutkan di bawah minus–
| No.Urut | Makro & Deskripsi |
| 1 | __LINE__ Ini berisi nomor baris saat ini dari program saat dikompilasi. |
| 2 | __FILE__ Ini berisi nama file saat ini dari program saat dikompilasi. |
| 3 | __DATE__ Ini berisi string dengan bentuk bulan/tanggal/tahun yang merupakan tanggal terjemahan file sumber menjadi kode objek. |
| 4 | __TIME__ Ini berisi string dengan bentuk jam:menit:detik yang merupakan waktu saat program dikompilasi. |
Mari kita lihat contoh untuk semua makro di atas minus–
Live Demo
#include <iostream> using namespace std; int main () { cout << "Nilai __LINE__ : " << __LINE__ << endl; cout << "Nilai __FILE__ : " << __FILE__ << endl; cout << "Nilai __DATE__ : " << __DATE__ << endl; cout << "Nilai __TIME__ : " << __TIME__ << endl; return 0; }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
Nilai __LINE__ : 6 Nilai __FILE__ : test.cpp Nilai __DATE__ : Feb 28 2011 Nilai __TIME__ : 18:52:48