Preprocessor dan Conditional Compilation

Preprocessor adalah bagian dari kode program yang dieksekusi saat compiler dijalankan. Keyword yang menandai preprocessor disebut dengan preprocessor directive. Contoh preprocessor directive yang sering digunakan dalam bahasa C++ adalah #include dan #define. Kesamaan keduanya selain waktu eksekusi saat kompilasi adalah keberadaan tanda hash (#). Preprocessor directive dalam bahasa C++ ditandai dengan hash.

Preprocessor tidak perlu tanda titik koma (;). Itu karena satu preprocessor diakhiri dengan perpindahan baris.

Selain #include dan #define, ada beberapa preprocessor directive yang lain. Beberapa preprocessor digunakan untuk conditional compilation (kompilasi kondisional). Preprocessor directive untuk conditional compilation bisa kalian lihat di bawah ini.

  • #ifdef => mengecek apakah konstanta sudah didefinisikan.
  • #ifndef => mengecek apakah konstanta tidak didefinisikan.
  • #else => dieksekusi jika #ifdef dan #ifndef bernilai salah.
  • #endif => menandai akhir dari conditional compilation.
  • #elif => pasangan dari #if
  • #if => pengecekan kondisi saat kompilasi program.

Selain #if, preprocessor directive di atas biasa digunakan bersama untuk mengecek konstanta yang sudah didefinisikan di dalam header dengan #define. #if dan #elif biasanya digunakan bersama dengan keyword defined.

Beberapa header dibuat berbeda isinya untuk menandai sistem operasi atau compiler yang digunakan. Perbedaan tersebut memungkinkan untuk membuat kode program dicompile dengan cara yang berbeda di sistem operasi yang berbeda. Kalian mungkin akan memerlukan conditional compilation saat ingin melewatkan beberapa baris statement atau membuat beberapa versi function sesuai sistem operasinya.

#include <iostream>

#define definisi

using namespace std;

int main(){
    cout << "OS-nya adalah ";
    #if defined(_WIN32)
	cout << "windows 32bit";
    #elif defined(_WIN64)
	cout << "windows 64bit";
    #elif defined(__ANDROID__)
	cout << "Android";
    #elif defined(__linux__)
	cout << "Linux";
    #else
	cout << "OS lainnya";
    #endif
   
    #ifdef definisi
        printf("\nNama definisi sudah didefinisikan");
        #undef definisi
    #endif

    return 0;
}
Output :
OS-nya adalah Android
Nama definisi sudah didefinisikan

Program di atas ditentukan berdasarkan tempat kalian meng-compile program. Sekalipun kalian pakai versi OS yang berbeda saat menjalankannya, hasil dari program yang sama akan selalu sama. Kalau hasilnya tidak sesuai, itu terjadi karena compiler tidak mendefinisikan konstanta yang dicek.

Conditional compilation memungkinkan untuk hanya menulis satu project untuk beberapa OS, walaupun kalian tetap perlu mengcompile project kalian di setiap OS.