Latest web development tutorials

C ++ preprocessor

Beberapa arahan preprocessor, mengarahkan preprocessor untuk compiler sebelum kompilasi yang sebenarnya Anda butuhkan untuk menyelesaikan.

Semua arahan preprocessor adalah (#) dimulai dengan tanda pound, hanya karakter spasi mungkin muncul sebelum arahan preprocessor. C ++ preprocessor direktif bukan pernyataan, sehingga mereka tidak titik koma; di akhir ().

Kita telah melihat semua contoh sebelumnya memiliki direktif# include.makro ini digunakan file header dimasukkan dalam file sumber.

C ++ juga mendukung sejumlah arahan preprocessing, seperti # include, # mendefinisikan, # jika, # lain, # line, dll, mari kita lihat ini petunjuk penting.

preprocessing #define

#define preprocessor directive digunakan untuk membuat konstanta simbolik. Simbolis konstan biasanya disebutmakro, bentuk perintah umum adalah:

#define macro-name replacement-text 

Ketika baris kode ini muncul dalam sebuah file, file tersebut muncul dalam berikutnya Semua macro akan diganti dengan pengganti-teks sebelum program dikompilasi. Sebagai contoh:

#include <iostream>
using namespace std;

#define PI 3.14159

int main ()
{
 
    cout << "Value of PI :" << PI << endl; 

    return 0;
}

Sekarang, mari kita uji kode ini, kita lihat hasil pretreatment. Misalkan file sumber sudah ada, kemudian gunakan opsi -E untuk mengkompilasi dan untuk mengarahkan hasil untuk test.p. Sekarang, jika Anda melihat berkas test.p, Anda akan melihat bahwa itu sudah berisi banyak informasi, dan nilai itu berubah di bawah file sebagai berikut:

$gcc -E test.cpp > test.p

...
int main ()
{
 
    cout << "Value of PI :" << 3.14159 << endl; 

    return 0;
}

Fungsi makro

Anda dapat menggunakan #define untuk mendefinisikan makro sebagai berikut dengan parameter:

#include <iostream>
using namespace std;

#define MIN(a,b) (((a)<(b)) ? a : b)

int main ()
{
   int i, j;
   i = 100;
   j = 30;
   cout <<"The minimum is " << MIN(i, j) << endl;

    return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

The minimum is 30

kompilasi bersyarat

Ada beberapa perintah yang dapat digunakan secara selektif pada bagian dari kode sumber program dikompilasi. Proses ini dikenal sebagai kompilasi bersyarat.

Struktur dan memilih jika kondisi struktural seperti preprocessor. Perhatikan kode bagian preprocessor berikut:

#ifndef NULL
   #define NULL 0
#endif

Anda dapat membuat hanya ketika dikompilasi dengan debugging, debugging dapat diwujudkan dengan menggunakan makro, sebagai berikut:

#ifdef DEBUG
   cerr <<"Variable x = " << x << endl;
#endif

Jika sebelum instruksi ifdef DEBUG telah didefinisikan DEBUG konstan simbolis, itu akan menjadi terhadap laporan program yangcerr dikompilasi.Anda dapat menggunakan # jika 0 komentar keluar bagian pernyataan program, sebagai berikut:

#if 0
   不进行编译的代码
#endif

Mari kita coba contoh berikut:

#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: Inside main function" << endl;
#endif

#if 0
   /* 这是注释部分 */
   cout << MKSTR(HELLO C++) << endl;
#endif

   cout <<"The minimum is " << MIN(i, j) << endl;

#ifdef DEBUG
   cerr <<"Trace: Coming out of main function" << endl;
#endif
    return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Trace: Inside main function
The minimum is 30
Trace: Coming out of main function

# Dan ## operator

# ## Dan Operator preprocessing di C ++ dan ANSI / ISO C di dalamnya tersedia. # Operator pengganti-teks tanda akan dikonversi ke string diapit tanda kutip.

Pertimbangkan definisi makro berikut:

#include <iostream>
using namespace std;

#define MKSTR( x ) #x

int main ()
{
    cout << MKSTR(HELLO C++) << endl;

    return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

HELLO C++

Mari kita lihat cara kerjanya. Maklum, C ++ preprocessor baris berikut:

cout << MKSTR(HELLO C++) << endl;

Diubah menjadi:

cout << "HELLO C++" << endl;

## Operator digunakan untuk menghubungkan dua token. Berikut adalah contoh:

#define CONCAT( x, y )  x ## y

Ketika CONCAT muncul dalam program ini, parameter yang akan dihubungkan, dan digunakan untuk menggantikan makro. Misalnya, program CONCAT (HELLO, C ++) diganti dengan "HELLO C ++", seperti yang ditunjukkan dalam contoh berikut.

#include <iostream>
using namespace std;

#define concat(a, b) a ## b
int main()
{
   int xy = 100;
   
   cout << concat(x, y);
   return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

100

Mari kita lihat cara kerjanya. Maklum, C ++ preprocessor baris berikut:

cout << concat(x, y);

Diubah menjadi:

cout << xy;

C ++ makro yang telah ditetapkan

C ++ disediakan dalam tabel di bawah beberapa macro yang telah ditetapkan:

描述
__LINE__ 这会在程序编译时包含当前行号。
__FILE__ 这会在程序编译时包含当前文件名。
__DATE__ 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。
__TIME__ 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。

Mari kita lihat macro contoh-contoh ini:

#include <iostream>
using namespace std;

int main ()
{
    cout << "Value of __LINE__ : " << __LINE__ << endl;
    cout << "Value of __FILE__ : " << __FILE__ << endl;
    cout << "Value of __DATE__ : " << __DATE__ << endl;
    cout << "Value of __TIME__ : " << __TIME__ << endl;

    return 0;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

Value of __LINE__ : 6
Value of __FILE__ : test.cpp
Value of __DATE__ : Feb 28 2011
Value of __TIME__ : 18:52:48