Bộ tiền xử lý C ++
Các bộ tiền xử lý là các chỉ thị, cung cấp các chỉ dẫn cho trình biên dịch để xử lý trước thông tin trước khi quá trình biên dịch thực sự bắt đầu.
Tất cả các chỉ thị tiền xử lý đều bắt đầu bằng # và chỉ các ký tự khoảng trắng mới có thể xuất hiện trước một chỉ thị tiền xử lý trên một dòng. Các chỉ thị tiền xử lý không phải là câu lệnh C ++, vì vậy chúng không kết thúc bằng dấu chấm phẩy (;).
Bạn đã thấy một #includechỉ thị trong tất cả các ví dụ. Macro này được sử dụng để đưa tệp tiêu đề vào tệp nguồn.
Có một số chỉ thị tiền xử lý được C ++ hỗ trợ như #include, #define, #if, #else, #line, v.v. Hãy để chúng tôi xem các chỉ thị quan trọng -
#Define Preprocessor
Chỉ thị tiền xử lý #define tạo các hằng số tượng trưng. Hằng số biểu tượng được gọi làmacro và hình thức chung của chỉ thị là -
#define macro-name replacement-text
Khi dòng này xuất hiện trong một tệp, tất cả các lần xuất hiện tiếp theo của macro trong tệp đó sẽ được thay thế bằng văn bản thay thế trước khi chương trình được biên dịch. Ví dụ -
#include <iostream>
using namespace std;
#define PI 3.14159
int main () {
cout << "Value of PI :" << PI << endl;
return 0;
}
Bây giờ, chúng ta hãy thực hiện tiền xử lý mã này để xem kết quả giả sử chúng ta có tệp mã nguồn. Vì vậy, hãy để chúng tôi biên dịch nó với tùy chọn -E và chuyển hướng kết quả đến test.p. Bây giờ, nếu bạn kiểm tra test.p, nó sẽ có rất nhiều thông tin và ở dưới cùng, bạn sẽ thấy giá trị được thay thế như sau:
$gcc -E test.cpp > test.p
...
int main () {
cout << "Value of PI :" << 3.14159 << endl;
return 0;
}
Macro giống hàm
Bạn có thể sử dụng #define để xác định macro sẽ nhận đối số như sau:
#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;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
The minimum is 30
Biên soạn có điều kiện
Có một số chỉ thị, có thể được sử dụng để biên dịch các phần chọn lọc của mã nguồn chương trình của bạn. Quá trình này được gọi là quá trình biên dịch có điều kiện.
Cấu trúc tiền xử lý có điều kiện giống cấu trúc lựa chọn 'if'. Xem xét mã tiền xử lý sau:
#ifndef NULL
#define NULL 0
#endif
Bạn có thể biên dịch một chương trình cho mục đích gỡ lỗi. Bạn cũng có thể bật hoặc tắt gỡ lỗi bằng cách sử dụng một macro như sau:
#ifdef DEBUG
cerr <<"Variable x = " << x << endl;
#endif
Điều này gây ra cerrcâu lệnh sẽ được biên dịch trong chương trình nếu hằng số tượng trưng DEBUG đã được xác định trước chỉ thị #ifdef DEBUG. Bạn có thể sử dụng trạng thái #if 0 để nhận xét về một phần của chương trình như sau:
#if 0
code prevented from compiling
#endif
Hãy để chúng tôi thử ví dụ sau:
#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
/* This is commented part */
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;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
The minimum is 30
Trace: Inside main function
Trace: Coming out of main function
Toán tử # và ##
Các toán tử tiền xử lý # và ## có sẵn trong C ++ và ANSI / ISO C. Toán tử # khiến mã thông báo văn bản thay thế được chuyển đổi thành một chuỗi được bao quanh bởi dấu ngoặc kép.
Hãy xem xét định nghĩa macro sau:
#include <iostream>
using namespace std;
#define MKSTR( x ) #x
int main () {
cout << MKSTR(HELLO C++) << endl;
return 0;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
HELLO C++
Hãy để chúng tôi xem nó hoạt động như thế nào. Có thể hiểu đơn giản rằng bộ tiền xử lý C ++ biến dòng -
cout << MKSTR(HELLO C++) << endl;
Dòng trên sẽ được chuyển thành dòng sau:
cout << "HELLO C++" << endl;
Toán tử ## được sử dụng để nối hai mã thông báo. Đây là một ví dụ -
#define CONCAT( x, y ) x ## y
Khi CONCAT xuất hiện trong chương trình, các đối số của nó được nối và dùng để thay thế macro. Ví dụ, CONCAT (HELLO, C ++) được thay thế bằng "HELLO C ++" trong chương trình như sau.
#include <iostream>
using namespace std;
#define concat(a, b) a ## b
int main() {
int xy = 100;
cout << concat(x, y);
return 0;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
100
Hãy để chúng tôi xem nó hoạt động như thế nào. Có thể hiểu đơn giản rằng bộ tiền xử lý C ++ biến đổi -
cout << concat(x, y);
Dòng trên sẽ được chuyển thành dòng sau:
cout << xy;
Macro C ++ được xác định trước
C ++ cung cấp một số macro được xác định trước được đề cập bên dưới:
Sr.No | Macro & Mô tả |
---|---|
1 | __LINE__ Điều này chứa số dòng hiện tại của chương trình khi nó đang được biên dịch. |
2 | __FILE__ Điều này chứa tên tệp hiện tại của chương trình khi nó đang được biên dịch. |
3 | __DATE__ Điều này chứa một chuỗi có dạng tháng / ngày / năm là ngày dịch tệp nguồn thành mã đối tượng. |
4 | __TIME__ Điều này chứa một chuỗi có dạng giờ: phút: giây là thời gian chương trình được biên dịch. |
Hãy để chúng tôi xem một ví dụ cho tất cả các macro ở trên -
#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;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
Value of __LINE__ : 6
Value of __FILE__ : test.cpp
Value of __DATE__ : Feb 28 2011
Value of __TIME__ : 18:52:48