[ HTML ] [ Java ] [ Bahasa C ]


Minggu, Mei 02, 2021

Makro dan Preprocessor pada Bahasa C

Pada bahasa C, semua baris dimulai dengan tanda # yang diproses oleh preprocessor yang merupakan program khusus yang dipanggil oleh kompilator. Pada pengertian dasar, preprocessor mengambil sebuah program C dan menghasilkan program C lainnya tanpa memiliki tanda #. Berikut ini beberapa fakta menarik tentang preprocessor pada bahasa C.

satu, Ketika menggunakan direktif include, konten dari header file akan digandakan menuju file yang saat ini digunakan. Tanda "< >" menginstruksikan preprosessor untuk melihat ke dalam folder standar dimana semua file header berada. Tanda petik "" menginstruksikan preprosessor untuk melihat ke folder saat ini atau direktor saat ini.

dua, Ketika menggunakan define untuk konstanta, preprocessor akan memproduksi program C dimana konstanta didefinisikan akan dicari dan dicocokkan dengan ekpresi yang digunakan sebagai pengganti. Contoh pada program max yang didefinisikan sebagai 100.

/* Macros dan preprocessor pada bahasa C */

/* Menggunakan define untuk konstanta */

 

#include<stdio.h>

#define max 100

 

int main()

{

printf("nilai maksimum adalah %d", max);

return 0;

}

Output:
nilai maksimum adalah 100

tiga, Makro juga digunakan sebagai fungsi seperti argumen, dimana argumen tidak diperiksa untuk tipe data. Contohnya, makro INCREMENT(X) yang dapat digunakan untuk x dengan tipe data apapun.

/* Macros dan preprocessor pada bahasa C */

/* Menggunakan macros INCREMENT (X) */

 

#include <stdio.h>

#define INCREMENT(x) ++x

 

int main()

{

char *ptr = "Jumanji";

int x = 10;

printf("%s ", INCREMENT(ptr));

printf("%d", INCREMENT(x));

return 0;

}

Output:
Jumanji 11

empat, Argument makro tidak dievaluasi sebelum makro ekspansi. Contohnya, perhatikan program berikut ini:

/*Macros dan preprocessor pada bahasa C*/

 

#include <stdio.h>

#define MULTIPLY(a, b) a*b

 

int main()

{

// Macros diekspansi sebagai 

// 2 + 3 * 3 + 5, namun tidak sebagai 5*8

printf("%d", MULTIPLY(2+3, 3+5));

return 0;

}

Output:
16

Permasalahan yang tejadi pada program sebelumnya dapat diselesaikan dengan cara berikut ini:

/* Macros dan preprocessor pada bahasa C */

#include <stdio.h>

 

//kode program tidak ditulis a*a melainkan (a)*(b)

#define MULTIPLY(a, b) (a)*(b)

 

int main()

{

// macros diperluas sebagai berikut 

// (2 + 3) * (3 + 5), dan dibaca sebagai 5*8

printf("%d", MULTIPLY(2+3, 3+5));

return 0;

}

Output:
40

lima, Token yang diteruskan ke makro dapat digabungkan menggunakan operator ## yang disebut operator Token-Pasting.

/* Macros dan Preprocessor pada bahasa C */

/* Menggunakan operator token pasting ## */

 

#include <stdio.h>

#define merge(a, b) a##b

 

int main()

{

printf("%d ", merge(12, 34));

}

Output:
1234

enam, Sebuah token yang dilewatkan menuju makro dapat dikonversi menjadi sebuah string literal dengan menggunakan #.

/* Macros dan preprocessor pada bahasa C */

/* Stirng literal menggunakan operator # */

 

#include <stdio.h>

#define get(a) #a

 

int main()

{

// Jumanji is changed to "Jumanji"

printf("%s", get(Jumanji));

}

Output:
Jumanji

tujuh, Makro dapat dideklarasikan pada baris ganda dengan menggunakan tanda '\'. Baris terakhir tidak memerlukan tanda '\'.

#include <stdio.h>

#define PRINT(i, limit) while (i < limit) \

{ \

printf("Jumanji "); \

i++; \

}

 

 

 

int main()

{

int i = 0;

PRINT(i, 3);

return 0;

}

Output:
Jumanji Jumanji Jumanji

delapan, Makro dengan argumen harus dihindari penggunaannya karena sering menyebabkan error. Serta, fungsi inline bisa lebih sering digunakan karena ada evaluasi tipe parameter pemeriksaan dalam fungsi inline. Dari tipe C99 dan seterusnya, fungsi inline telah didukung penggunaannya oleh bahasa C. Contohnya, perhatikan program berikut ini. Jika dilihat sekilas hasil output adalah 1, tetapi hasil yang dikeluarkan adalah 36.

/* Macros dan preprocessor pada bahasa C */

#include <stdio.h>

#define square(x) x*x

 

int main()

{

// Expanded as 36/6*6

int x = 36/square(6);

printf("%d", x);

return 0;

}

Output:
36

Jika menggunakan fungsi inline, maka didapatkan ekspektasi dari output. Serta, program yang terdapat pada baris 4 dan seterusnya akan dikoreksi menggunakan fungsi inline.

/* Macros dan preprocessor pada bahasa C */

#include <stdio.h>

 

static inline int square(int x) { return x*x; }

 

int main()

{

int x = 36/square(6);

printf("%d", x);

return 0;

}

Output:
1

sembilan, Preprocessor juga mendukung if-else direktif yang pada dasarnya digunakan untuk kompilasi kondisional.

/* Macros dan Preprocessor pada bahasa C */

int main()

{

 

#if VERBOSE >= 2

printf("Trace Message");

 

#endif

 

}

Output:
No Output

sepuluh, Sebuah file header mungkin memiliki lebih dari satu kondisi langsung ataupun tidak langsung yang mengarahkan kepada deklarasi permasalahan dari variabel atau fungsi yang sama. Untuk menghindari permasalahan ini, direktif seperti defined, ifdef, dan ifndef digunakan.

sebelas, Terdapat beberapa standarisasi makro yang dapat digunakan untuk mencetak program file (_FILE_), Kompilasi tanggal (_DATE_), Kompilasi tanggal (_TIME_), dan baris angka (_LINE_).

/* Macros dan Preprocessor pada bahasa C */

#include <stdio.h>

 

int main()

{

printf("File saat ini :%s\n", __FILE__ );

printf("Tanggal saat ini :%s\n", __DATE__ );

printf("Waktu saat ini :%s\n", __TIME__ );

printf("Baris angka :%d\n", __LINE__ );

return 0;

}

Output:
File Saat ini :/usr/share/IDE_PROGRAMS/C/other/081c548d50135ed88cfa0296159b05ca/081c548d50135ed88cfa0296159b05ca.c
Tanggal saat ini :Sep  4 2019
Waktu saat ini :10:17:43
Baris angka :9

duaBelas, Dapat dilakukan penghapusan makro yang telah didefinisikan:
#undef MACRO_NAME

/* macros dan preprocessor pada bahasa C */

#include <stdio.h>

#define LIMIT 100

 

int main()

{

printf("%d",LIMIT);

   

//menghilangkan definisi macro LIMIT

#undef LIMIT

   

//baris selanjutnya akan menyebabkan 

// error karena LIMIT tidak terdefinisi

 

printf("%d",LIMIT);

   

return 0;

}


Diikuti program yang dieksekusi secara tepat seperti yang telah dideklarasikan, yaitu LIMIT sebagai variabel bilangan bulat setelah penghapusan definisi makro LIMIT sebelumnya.

/* Macros dan preprocessor pada bahasa C */

/* Penghapusan Macros */

#include <stdio.h>

#define LIMIT 1000

 

int main()

{

printf("%d",LIMIT);

 

//Menghapus macros LIMIT

#undef LIMIT

//Mendeklarasikan LIMIT kembali sebagai nilai integer

 

int LIMIT=1001;

printf("\n%d",LIMIT);

return 0;

 

}

Output:
1000
1001

Fakta menarik lainnya seputar makro dengan menggunakan #undef

/* Macros dan preprocessor pada bahasa C */

/* Macros menggunakan undef*/

#include <stdio.h>

 

//fungsi prototype div

float div(float, float);

#define div(x, y) x/y

 

int main()

{

 

// menggunakan macros div

// Note: %0.2f untuk mengambil 

// nilai dua desimal setelah tanda titik

printf("%0.2f",div(10.0,5.0));

 

// menghapus macros div

#undef div

// function div dipanggil kembali 

// sebagai definisi macros yang telah dihapus

 

printf("\n%0.2f",div(10.0,5.0));

return 0;

}

 

//pendefinisian fungsi div

float div(float x, float y){

return y/x;

}

Output:
2.00
0.50

6 komentar:

  1. Macros merupakan fragmen kode yang telah diberi nama pada bahasa pemrogram (bahasa C). Macros mirip dengan objek yang menyerupai objek data lainnya saat sedang digunakan pada program, macros juga dapat menyerupai fungsi pemanggilan ketika sedang digunakan pada program.

    User dapat menentukan apakah define yang bersifat valid dapat digunakan sebagai macros atau tidak, meskipun keyword yang digunakan pada define tersebut adalah bagian dari keyword bahasa C itu sendiri. Preprosesor tidak mengetahui apapun tetang penggunaan keyword pada saat define tersebut.

    BalasHapus
  2. Preprosessor pada bahasa C adalah suatu prosesor macros yang digunakan secara otomatis oleh kompilator bahasa C untuk mengubah program sebelum kompilasi program dijalankan. Disebut preprosesor macros karena memungkinkan programmer untuk menentukkan macros pada program yang dibuatnya, baik itu yang merupakan singkatan ataupun bentuk konstruksi lain yang lbeih panjang.

    BalasHapus
  3. Secara sederhana apa yang dimaksud dengan makro dan kenapa bahasa c menggunakan makro?

    BalasHapus
    Balasan
    1. Makro adalah segala sesuaty yang sama seperti halnya makro pada dunia pemrograman: Dimana fungsi macros itu sendiri adalah untuk melakukan penyederhanaan atau penyingkatan secara otomatis terhadap suatu keyword yang lebih panjang dan rumit. Salah satu alasan kenapa macros digunakan pada bahasa pemrograman C adalah untuk peningkatan kinerja dalam pembuatan program.

      Hapus
  4. Apa yang dimaksud dengan preprosesor bahasa C?

    BalasHapus
    Balasan
    1. Proprosesor baahsa C adalah preprosesor macros untuk bahasa pemrograman komputer C, Objective-C, dan C++. Preprosesor tersebut menyediakan kemampuan untuk memasukkan file header, perluasan macros, kompilasi bersyarat, kontrol baris.

      Hapus

Respon komentar 7 x 24 jam, so please be patient :D