Sabtu, 19 September 2009

PREPROCESSOR DIRECTIVES

Preprocessor directives adalah perintah-perintah khusus yang ditujukan ke preprocessor. Semua preprocessor directives dimulai dengan tanda #. Karena preprocessor adalah perintah untuk preprocessornya C++ maka preprocessor directives tidak diakhiri dengan titik koma (;).
Preprocessor directives ini akan mengubah program pada saat dikompile saja, jadi perubahannya hanya bersifat sementara sementara. Setelah selesai maka program akan kembali seperti semula.
Beberapa perintah preprocessor akan dibahas di bagian ini.
4.1 #define directive
Dipakai untuk mendefinisikan suatu identifier dari suatu karakter string yang disubstitusikan ke identifier tersebut (macro substitution) setiap kali dijumpai dalam program.
Format dari #define adalah :#define ARGUMENT1 argumen2
Berikut adalah contoh pemakaian #define, perhatikan bahwa ARGUMEN1 biasa ditulis dengan huruf besar:
#define FALSE 0
#define TRUE !FALSE
#define ERROR 1 “Tidak dapat membuka file”
#define UMUR_S1 22
Perintah-perintah di atas menyuruh kompiler untuk mensubstitusikan 0, !0,“Tidak dapat membuka file” dan 22 setiap menjumpai FALSE, TRUE, ERROR1dan UMUR_S1 dalam program. #define directive ini dapat juga dipakai sebagai suatu makro dengan beberapa argumen, setiap kali nama makro tersebut dijumpai dalam program maka argumen-argumennya diganti oleh argumen-argumen sebenarnya yang ditemukan dalam program, misalnya:
#define MAX(A,B) ((A) > (B) ? (A) : (B))
maksimum = MAX(23,45);
Perhatikan bahwa substitusi yang dilakukan adalah substitusi text sederhana saja,sehingga kalau tidak hati-hati akan timbul efek sampingan yang menyesatkan, misalya:
#define PI 3.1415927
#define L_LING(A) PI*A*A
luas_lingkaran L_LING(2+1);
Yang terjadi setelah substitusi dilakukan adalah:
luas_lingkaran = 3.1415927*2+1*2+1;
sehingga hasilnya tidak seperti yang diharapkan, supaya effek samping seperti di atastidak terjadi maka harus ditambahkan tanda kurung di dalam argumennya sebagai berikut:
#define L_LING(A) PI*(A)*(A)
C++ mempunyai kata kunci inline sebagai function qualifier. Kata kunci ini menyebabkan copy dari fungsi tersebut disubstitusikan setiap fungsi ini dipanggil. Jadijika kita memanggil fungsi inline ini 20 kali dalam program maka kompiler akan menyisipkan 20 copy dari fungsi ini ke EXE file kita. Penyisipan ini menyebabkan program dapat lebih cepat karena tidak diperlukan overhead pada saat pemanggilan fungsi, yaitu parameter-parameternya tidak perlu ditempatkan dalam stack terlebih dulu. Namun penyisipan ini akan menyebabkan ukuran program menjadi besar sehingga kita sebaiknya memakai fungsi inline ini untuk fungsi-fungsi yang kecil atau yang hanya dipanggil di beberapa tempat saja.
Fungsi inline kerjanya mirip dengan makro yang dideklarasi dengan #definedirective, keuntungannya adalah fungsi inline ini dikenali oleh kompiler sehingga kompiler melakukan type checking dan parameter-parameternya. Keuntungan lain adalah fungsi inline ini berkelakuan seperti fungsi biasa tanpa resiko effek samping yang dijumpai substitusi makro. Kata kunci inline ini hanya berupa saran ke kompiler. Fungsi yang lebih besar dari beberapa baris tidak akan dijadikan fungsi inline meskipundeklarasinya memakai kata kunci inline.
Contoh program berikut ini menjelaskan pemakaian fungsi inline.
//include
#define MAX(A,B) ((A) > (B) ? (A): (B))
inline int max(int a, int b)
{
if(a > b)
return a;
return b;
}
main ()
{
int i, x, y;
x = 23; y = 45;
i = MAX(x++, y++); // Effek samping, variabel y dinaikan 2 kali
// Output : x = 24 y = 47
cout << “x = “ << y =" “">
x = 23; y = 45;
i = max(x++, y++);
// Output : x = 24 y = 46
cout << “x =” <<>
return 0;
}
4.2 #include Preprocessor Directive
#include preprocessor directive menyisipkan suatu text file yang ada di disk ke dalam program. Format dari #include preprocessor directive adalah:
#include atau
#include “nama_file”
Text file yang disisipkan dapat apa saja namun umumya yang disisipkan adalah Headerfile. Header file ini akan memberi informasi kepada kompiler C++ bagaimana menginterpretasikan fungsi-fungsi library yang akan dipakai. Misalnya kompiler C++ -memerlukan informasi mengenai fungsi cout, fungsi cin maka perlu disisipkan headerfile iostream.h sebagai berikut:
#include atau
#include “iostream.h”
Tampak bahwa untuk menyisipkan text file ada dua pilihan:
- Nama file diantara tanda kurung <>, pilihan ini memberitahu preprocessor untuk mencari header file di lokasi default yang telah ditetapkan sebelumnya, pilihan ini biasa dipakai untuk menyisipkan standard header yang terletak pada include file direktori yang telah di setuntuk kompiler yang dipakai. Standard header file ini berasal dari kompiler. Programmer pada umumnya tidak melakukan perubahan pada standar header file.
- Nama file diantara sepasang tanda kutip ganda (“ “), pilihan ini memberitahu preprocessor untuk mencari dulu header file di direktori yang saat ini aktif kalau tidak ketemu dilanjutkan pencariannya ke lokasi-lokasi yang telah ditetapkan oleh programmer sebelumnya, pilihan ini biasa dipakai untuk menyisipkan non-standard header file, Non-standard header file sering mengalami modifikasi oleh programmer yang membuatnya dan preprocessor selalu menyisipkan yang terbaru.
4.3 #if, #else dan #endif Preprocessor Directive
Antara kompiler yang satu dengan kompiler yang lainnya dapat menggunakan nama yang berbeda untuk suatu header file yang definisinya hampir sama. Misal headerfile alloc.h pada Borland C++ adalah hampir ekivalen dengan header file malloc.h pada Microsoft C++. Jadi kita perlu sarana untuk menentukan header file yang mana yang harus disisipkan pada saat program dikompile, misalnya program yang dibuat harusmendukung Borland C++ dan Microsoft C++ maka pemakaian preprocessor directivenya adalah sebagai berikut:
#ifdef __BORLAND__
#include
#else
#include
#endif
Kalau header file ini dikompile dengan Borland C++ maka nama simbolik__BORLAND__ otomatis didefinisikan oleh kompiler sehingga standard header filealloc.h yang disisipkan.
Dalam C++ programmer umumnya membatasi apa saja yang dapat masuk kedalam header file yang dibuat. Header file umumnya hanya memuat definisi-definisi misalnya tipe, nama variabel ekternal, definisi struktur, konstanta, makro dan prototipefungsi. Programmer biasanya menghindari satu header file raksasa yang memuat semua definisi karena memperlambat proses kompilasi. Umumnya programmer lebih menyukai beberapa header file yang lebih kecil, jadi ada beberapa header file. Kalau satu header file disisipkan lebih dari satu kali secara tidak sengaja (header file dapat bersusun, artinya dalam suatu header file ada header file yang lain) maka akan ada definisi ulang yang akan menimbulkan kesalahan pada saat program di kompile. Untuk menghindari keadaan ini dapat dipakai preprocessor directive #ifndef, #define dan #endif untuk membuat headerfile sebagai berikut:
#ifndef _NAMAFILE_H
#define _NAMAFILE_H
#define VER_NUM “1.00”
#define REL_DATE “27/09/95”
#if __WINDOWS__
#define OS_VER “WINDOWS”
#else
#define OS_VER “DOS
#endif
#endif
Pada saat header file ini dikompile, kompiler pertama-tama melakukan check apakah _NAMAFILE_H telah didefinisikan. Bila belum didefinisikan maka headerfile ini belum pernah disisipkan sehingga _NAMAFILE_H didefinisikan dulu lalu header file ini disisipkan. Bila NAMAFILE_H sudah didefinisikan maka isi dari header file ini tidak disisipkan.

Senin, 14 September 2009

My Biodata

Nama : Fanny Fransisca
TTL : Jakarta, 3 juni 1991
Alamat : jl prancis duta Bandara Permai Fs1 no 19
Agama : buddha
Wn : Indonesia
NIM : 0101090081