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ó ...
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 ten_cua_macro ten_thay_the
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 ten_thay_the 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 << "Gia tri cua PI la: " << PI << endl; return 0; }
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 << "Gia tri cua PI la: " << 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 = 35; j = 16; cout <<"Gia tri nho nhat la " << MIN(i, j) << endl; return 0; }
Biên dịch và thực thi code trên sẽ cho kết quả sau:
Gia tri nho nhat la 16
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 <<"Bien 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 khong duoc bien dich phan code nay #endif
Bạn 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 = 35; j = 16; #ifdef DEBUG cerr <<"Trace: Ben trong ham main!" << endl; #endif #if 0 /* Day la phan comment */ cout << VietJack(Lap trinh C++) << endl; #endif cout <<"Gia tri nho nhat la " << MIN(i, j) << endl; #ifdef DEBUG cerr <<"Trace: Ben ngoai ham main!" << endl; #endif return 0; }
Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:
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; #define VietJack( x ) #x int main () { cout << VietJack(Lap trinh C++) << endl; return 0; }
Biên dịch và chạy code trên sẽ cho kết quả sau:
Lap trinh 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 << VietJack(Lap trinh C++) << endl;
Thành dòng:
cout << "Lap trinh 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++" giống như trong chương trình sau:
#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { char* xy = "Hello C++"; cout << concat(x, y); return 0; }
Biên dịch và thực thi code trên sẽ cho kết quả:
Hello C++
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; int main () { cout << "Gia tri cua __LINE__ la: " << __LINE__ << endl; cout << "Gia tri cua __FILE__ la: " << __FILE__ << endl; cout << "Gia tri cua __DATE__ la: " << __DATE__ << endl; cout << "Gia tri cua __TIME__ la: " << __TIME__ << endl; return 0; }
Biên dịch và chạy chương trình C++ trên sẽ cho kết quả sau:
Mọi người cho thể tham gia khóa học thứ 6 của vietjackteam (đang tuyển sinh) vào đầu tháng 03/2018 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : .Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Số lượng các công việc Java hoặc .NET luôn gấp ít nhất 3 lần Android hoặc iOS trên thị trường tuyển dụng.
Mọi người có thể xem demo nội dung khóa học tại địa chỉ
Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Trong tháng 4/2018, VietJack khuyến mại giá SỐC chỉ còn 150k cho khóa học, liên hệ facebook admin fb.com/tuyen.vietjack để thanh toán chuyển khoản hoặc thẻ điện thoại, khóa học bằng Tiếng Việt với gần 100 video, các bạn có thể chủ động bất cứ lúc nào, và xem mãi mãi. Thông tin khóa học tại
Loạt bài hướng dẫn học lập trình C++ cơ bản và nâng cao của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint.com
Follow fanpage của team hoặc facebook cá nhân Nguyễn Thanh Tuyền để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.
Bài học C++ phổ biến khác tại vietjack.com: