Prapemproses C++
Prapemproses ialah arahan yang mengarahkan pengkompil tentang prapemprosesan yang perlu dilakukan sebelum penyusunan sebenar.
Semua arahan prapemproses bermula dengan tanda paun (#), dan hanya aksara ruang boleh muncul sebelum arahan prapemproses. Arahan prapemprosesan bukan penyataan C++, jadi ia tidak diakhiri dengan koma bertitik (;).
Kami telah melihat bahawa semua contoh sebelumnya mempunyai arahan #include. Makro ini digunakan untuk memasukkan fail pengepala ke dalam fail sumber.
C++ juga menyokong banyak arahan prapemprosesan, seperti #include, #define, #if, #else, #line, dll. Mari kita lihat arahan penting ini bersama-sama.
#define prapemprosesan
#define prapemprosesan arahan digunakan untuk mencipta pemalar simbolik. Pemalar simbolik ini biasanya dipanggil makro Bentuk umum arahan ialah:
#define macro-name replacement-text
Apabila baris kod ini muncul dalam fail, semua makro berikutnya yang muncul dalam fail akan Digantikan. dengan teks gantian sebelum atur cara disusun. Contohnya:
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }
Sekarang, mari kita uji kod ini dan lihat hasil prapemprosesan. Dengan mengandaikan bahawa fail kod sumber sudah wujud, gunakan pilihan -E untuk menyusun dan mengubah hala keputusan ke test.p. Sekarang, jika anda melihat fail test.p, anda akan melihat bahawa ia sudah mengandungi banyak maklumat, dan nilai di bahagian bawah fail telah ditukar kepada yang berikut:
$gcc -E test.cpp > test.p ... int main () { cout << "Value of PI :" << 3.14159 << endl; return 0; }
Fungsi Makro
Anda boleh menggunakan #define untuk mentakrifkan makro dengan parameter seperti ini:
#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; }
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
rreeePenyusunan bersyarat
Terdapat beberapa arahan yang boleh digunakan untuk menyusun bahagian kod sumber program secara selektif. Proses ini dipanggil kompilasi bersyarat.
Struktur prapemproses bersyarat sangat serupa dengan struktur pemilihan if. Sila lihat kod prapemproses berikut:
The minimum is 30
Anda hanya boleh menyusun semasa penyahpepijatan Suis penyahpepijatan boleh dilaksanakan menggunakan makro, seperti yang ditunjukkan di bawah:
#ifndef NULL #define NULL 0 #endif
Jika dalam arahan #ifdef DEBUG. Jika DEBUG pemalar simbolik telah ditakrifkan sebelum ini, pernyataan cerr dalam program akan disusun. Anda boleh mengulas sebahagian daripada program menggunakan #if 0 pernyataan seperti ini:
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #endif
Mari cuba contoh berikut:
#if 0 不进行编译的代码 #endif
Apabila kod di atas disusun dan dilaksanakan, ia akan Menghasilkan keputusan 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; }
# dan ## Operator Operator prapemproses
# dan ## tersedia dalam kedua-dua C++ dan ANSI/ISO C. Operator # menukarkan token teks gantian kepada rentetan yang dipetik.
Lihat takrifan makro di bawah:
Trace: Inside main function The minimum is 30 Trace: Coming out of main function
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan hasil berikut:
#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }
Mari lihat apa itu Bagaimana ia berfungsi . Tidak sukar untuk memahami bahawa prapemproses C++ menukar baris berikut:
HELLO C++
menjadi:
cout << MKSTR(HELLO C++) << endl;
## pengendali digunakan untuk menyambung dua token. Berikut ialah contoh:
cout << "HELLO C++" << endl;
Apabila CONCAT muncul dalam atur cara, hujahnya digabungkan dan digunakan sebagai ganti makro. Contohnya, CONCAT(HELLO, C++) dalam program akan digantikan dengan "HELLO C++", seperti yang ditunjukkan dalam contoh di bawah.
#define CONCAT( x, y ) x ## y
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { int xy = 100; cout << concat(x, y); return 0; }
Mari kita lihat cara ia berfungsi. Tidak sukar untuk memahami bahawa prapemproses C++ menukar baris berikut:
100
menjadi:
cout << concat(x, y);
Makro yang dipratentukan dalam C++
C++ menyediakan jadual berikut Beberapa daripada makro pratakrif:
宏 | 描述 |
---|---|
__LINE__ | 这会在程序编译时包含当前行号。 |
__FILE__ | 这会在程序编译时包含当前文件名。 |
__DATE__ | 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。 |
__TIME__ | 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。 |
Mari kita lihat contoh makro di atas ini:
cout << xy;
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
#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; }