Tải bản đầy đủ (.pdf) (7 trang)

Bộ tiền xử lý (Preprocessor) trong C++ | 101 bài hướng dẫn C++ hay nhất

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (401.71 KB, 7 trang )

/>
Copyright © vietjack.com

Bộ tiền xử lý (Preprocessor) trong C++
Bộ tiền xử lý (Preprocessor) là các directive (chỉ thị), cung cấp chỉ lệnh tới bộ biên dịch để tiền xử
lý thông tin trước khi bắt đầu biên dịch thực sự.
Tất cả chỉ thị tiền xử lý (Preprocessor directive) bắt đầu với #, và chỉ có các ký tự khoảng trống
trắng (white-space) là có thể xuất hiện ở trước một chỉ thị tiền xử lý trên một dòng. Chỉ thị tiền xử lý
không là các lệnh trong C++, vì thế chúng không kết thúc với một dấu chấm phảy.
Bạn đã thấy một chỉ thị tiền xử lý là #include trong tất cả ví dụ. Macro này được sử dụng để bao
một Header file vào trong source file.
Có một số chỉ thị tiền xử lý được hỗ trợ bởi C++ như #include, #define, #if, #else, #line, … Dưới
đây, chúng tôi sẽ trình bày các chỉ thị tiền xử lý quan trọng trong C++:

Bộ tiền xử lý # define trong C++
Chỉ thị tiền xử lý #define tạo các biểu tượng hằng. Biểu tượng hằng là một macro và mẫu chung
của chỉ thị tiền xử lý này trong C++ là:
#define macro-name replacement-text

Khi dòng này xuất hiện trong một file, tất cả macro xuất hiện theo sau trong file này sẽ được thay
thế bởi replacement-text 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;
}

Trang chia sẻ các bài học online miễn phí

Page 1


/>
Copyright © vietjack.com

Giả sử chúng ta có source file, sau đó biên dịch nó với tùy chọn –E và hướng kết quả tới test.p.
Bây giờ, nếu bạn kiểm tra test.p, nó sẽ có nhiều thông tin và tại dưới cùng, bạn sẽ tinh chỉnh giá trị
được thay thế như sau:
$gcc -E test.cpp > test.p

...
int main ()
{

cout << "Value of PI :" << 3.14159 << endl;

return 0;
}

Function-Like Macro trong C++
Bạn có thể sử dụng chỉ thị tiền xử lý #define trong C++ để định nghĩa một macro mà sẽ nhận tham
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;
}

Biên dịch và thực thi code trên sẽ cho kết quả sau:

Trang chia sẻ các bài học online miễn phí

Page 2


/>
Copyright © vietjack.com

The minimum is 30

Biên dịch có điều kiện trong C++
Có một số chỉ thị tiền xử lý có thể sử dụng để biên dịch có sự tuyển chọn giữa các phần trong
source code của bạn. Tiến trình này được gọi là biên dịch có điều kiện.
Chỉ lệnh tiền xử lý có điều kiện khá giống với cấu trúc lựa chọn if. Bạn xét code sau:
#ifndef NULL

#define NULL 0
#endif

Bạn có thể biên dịch một chương trình với mục đích debug và có thể tắt hoặc bật việc debug này
bởi sử dụng một macro trong C++, như sau:
#ifdef DEBUG
cerr <<"Variable x = " << x << endl;
#endif

Lệnh cerr để được biên dịch trong chương trình nếu biểu tượng hằng DEBUG đã được định nghĩa
ở trước chỉ thị #ifdef DEBUG. Bạn có thể sử dụng lệnh #if 0 để chú thích một phần của chương
trình, như sau:
#if 0
code prevented from compiling
#endif

Bạn thử ví dụ sau:
#include <iostream>
using namespace std;
#define DEBUG

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

int main ()
{

Trang chia sẻ các bài học online miễn phí

Page 3



/>
Copyright © vietjack.com

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;
}

Biên dịch và thực thi code trên sẽ cho kết quả sau:
Trace: Inside main function
The minimum is 30
Trace: Coming out of main function

Các toán tử # và ## trong C++

Các toán tử tiền xử lý # và ## là có sẵn trong C++ và ANSI/ISO C. Toán tử # thông báo rằng đoạn
văn bản thay thế sẽ được chuyển đổi sang một chuỗi bao quanh bởi dấu ngoặc kép.
Bạn xét định nghĩa macro sau:
#include <iostream>
using namespace std;

Trang chia sẻ các bài học online miễn phí

Page 4


/>
Copyright © vietjack.com

#define MKSTR( x ) #x

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

return 0;
}

Biên dịch và chạy code trên sẽ cho kết quả sau:
HELLO C++

Bây giờ, chúng ta xét cách nó đã làm việc. Nó là đơn giản để hiểu rằng bộ tiền xử lý C++ chuyển
dòng sau:
cout << MKSTR(HELLO C++) << endl;


Thành dòng:
cout << "HELLO C++" << endl;

Toán tử ## được sử dụng để nối chuỗi hai token. Ví dụ:
#define CONCAT( x, y )

x ## y

Khi CONCAT xuất hiện trong chương trình, các tham số của nó được nối chuỗi và được sử dụng
để thay thế cho macro. Ví dụ, CONCAT(HELLO, C++) được thay thế bởi "HELLO C++" trong
chương trình sau:
#include <iostream>
using namespace std;

#define concat(a, b) a ## b
int main()
{
int xy = 100;

Trang chia sẻ các bài học online miễn phí

Page 5


/>
Copyright © vietjack.com

cout << concat(x, y);
return 0;
}


Biên dịch và thực thi code trên sẽ cho kết quả:
100

Giờ chúng ta xét cách chúng đã làm việc. Đơn giản là bộ tiền xử lý C++ chuyển dòng sau:
cout << concat(x, y);

Thành dòng:
cout << xy;

Macro tiền định nghĩa trong C++
C++ cung cấp một số macro được định nghĩa trước như liệt kê dưới đây:
Macro

Miêu tả

__LINE__

Chứa số dòng hiện tại của chương trình khi nó đang được biên
dịch

__FILE__

Chứa tên file hiện tại của chương trình khi nó đang được biên
dịch

__DATE__

Chứa một chuỗi month/day/year là ngày source code được biên
dịch


__TIME__

Chứa một chuỗi hour:minute:second là thời gian chương trình
được biên dịch

Dưới đây là ví dụ cho tất cả macro ở trên trong C++:
#include <iostream>
using namespace std;

Trang chia sẻ các bài học online miễn phí

Page 6


/>
Copyright © vietjack.com

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;
}

Biên dịch và thực thi code trên sẽ cho kết quả:
Value of __LINE__ : 6

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

Trang chia sẻ các bài học online miễn phí

Page 7



×