Basic Cpp: C/C++ Preprocessors

Preprocessors adalah program yang memproses source code sebelum dicompile.

Program prepocessor ini menyediakan prepocesor directives yang akan memberitahu compiler untuk memprocess dulu source code kita sebelum dicompile.

Dalam source code kita, ditandai dengan simbol ‘#’ hash. contoh: #include, #define, #ifndef, dll

Ada 4 type prepocessor directive:

1. Macro

2. File Iclusion

3. Conditional Compilation

4. Other directives.

Macro

Syarat Penulisan Macro tidak menggunakan ‘;’ diakhir baris

Cara Kerja: jika compiler menemukan kata LIMIT di source code, maka akan diganti dengan angka 5.

#include <iostream> 
// macro definition 
#define LIMIT 5 
int main() 
{ 
for (int i = 0; i < LIMIT; i++) { 
std::cout << i << "\n"; 
} 
return 0; 
}

Macro dengan argumen

Cara Kerja: jika compiler menemukan AREA(l,b) di source code, maka akan diganti dengan (l*b) dan juga akan dieksekusi, sehingga output program akan bernilai 50

#include <iostream> 

// macro with parameter 
#define AREA(l, b) (l * b) 
int main() 
{ 
int l1 = 10, l2 = 5, area; 
area = AREA(l1, l2); 
std::cout << "Area of rectangle is: " << area; 
return 0; 
}

Output:

Area of rectangle is: 50

File Iclusion

Berfungsi untuk memberitahu compiler untuk men’include’ file dalam source code. Ada 2 type yang bisa digunakan:

1. Header File/Standard files

Dengan Syntax:

#include< file_name >

2. User Defined files

Dengan Syntax:

#include"filename"

Conditional Compilation

Menggunakan ‘ifdef‘ dan ‘endif

Syntax:

ifdef macro_name
statement1;
statement2;
statement3;
.
.
.
statementN;
endif

Other directives

1. #undef Directive, berfungsi untuk undefine macro,

#undef LIMIT

2. #pragma Directive: berfungsi untuk menghidupkan atau mematikan beberapa feature.

a. #pragma startup and #pragma exit: berfungsi untuk menjalankan functions sebelum program startup (sebelum main()) dan sebelum program exit (sebelum return pada main()).

#include <stdio.h> 
void func1(); 
void func2(); 
#pragma startup func1 
#pragma exit func2 

void func1() 
{ 
printf("Inside func1()\n"); 
} 
void func2() 
{ 
printf("Inside func2()\n"); 
} 
int main() 
{ 
void func1(); 
void func2(); 
printf("Inside main()\n"); 
return 0; 
}

Output:

Inside func1()
Inside main()
Inside func2()

Contoh dibawah ini hasilnya sama dengan Contoh diatas, tetapi tidak menggunakan #pragma startup and #pragma exit

#include <stdio.h> 
void func1(); 
void func2(); 
void __attribute__((constructor)) func1(); 
void __attribute__((destructor)) func2(); 

void func1() 
{ 
printf("Inside func1()\n"); 
} 
void func2() 
{ 
printf("Inside func2()\n"); 
} 

int main() 
{ 
printf("Inside main()\n"); 

return 0; 
}

Output:

Inside func1()
Inside main()
Inside func2()

b. #pragma warn Directive, berfungsi untuk menyembunyikan warning message saat compilasi.

Contoh: #pragma warn -rvl, #pragma warn -par, #pragma warn -rch

Beberapa yang menarik dari macro dan preprocessor di C

1. #include< file_name >, akan menginstrusikan prepocessor untuk mencari file tersebut di standard folder, sedangkan #include”filename” preprocessor akan menjadi di current folder.

2. Argument pada Macro, tidak dicek tipe datanya.

#include <stdio.h> 
#define INCREMENT(x) ++x 
int main() 
{ 
char *ptr = "GeeksQuiz"; 
int x = 10; 
printf("%s ", INCREMENT(ptr)); 
printf("%d", INCREMENT(x)); 
return 0; 
} 
// Output: eeksQuiz 11

3. Argument pada macro tidak dicek

#include <stdio.h> 
#define MULTIPLY(a, b) a*b 
int main() 
{ 
// The macro is expended as 2 + 3 * 3 + 5, not as 5*8 
printf("%d", MULTIPLY(2+3, 3+5)); 
return 0; 
} 
// Output: 16

bandingkan dengan program di bawah:

#include <stdio.h> 
//here, instead of writing a*a we write (a)*(b) 
#define MULTIPLY(a, b) (a)*(b) 
int main() 
{ 
// The macro is expended as (2 + 3) * (3 + 5), as 5*8 
printf("%d", MULTIPLY(2+3, 3+5)); 
return 0; 
} 
//This code is contributed by Santanu 
// Output: 40

Bersambung…

Leave a Reply

Your email address will not be published. Required fields are marked *