Bộ tiền xử lý C (C Preprocessor) không phải là một phần của trình biên dịch, mà là bước riêng trong quá trình biên dịch. Nói đơn giản, CPP chỉ là công cụ thay thế văn bản (text substitution) và chỉ dẫn trình biên dịch làm tiền xử lý cần thiết trước khi biên dịch thực sự. Chúng ta gọi tắt là CPP.
Tất cả lệnh tiền xử lý bắt đầu bằng ký hiệu #. Phải là ký tự không phải khoảng trắng đầu tiên, và để dễ đọc, nên đặt ở cột đầu tiên. Dưới đây liệt kê các chỉ thị quan trọng:
| STT | Chỉ thị & Mô tả |
|---|---|
| 1 | #define Thay thế macro tiền xử lý. |
| 2 | #include Chèn header từ file khác. |
| 3 | #undef Hủy định nghĩa macro. |
| 4 | #ifdef Trả về true nếu macro đã định nghĩa. |
| 5 | #ifndef Trả về true nếu macro chưa định nghĩa. |
| 6 | #if Kiểm tra điều kiện biên dịch. |
| 7 | #else Phân nhánh thay thế cho #if. |
| 8 | #elif Kết hợp #else và #if. |
| 9 | #endif Kết thúc điều kiện tiền xử lý. |
| 10 | #error In thông báo lỗi ra stderr. |
| 11 | #pragma Gửi lệnh đặc biệt đến trình biên dịch. |
Một số ví dụ tiền xử lý:
#define MAX_ARRAY_LENGTH 20
Chỉ thị này bảo CPP thay thế MAX_ARRAY_LENGTH bằng 20. Dùng #define cho hằng số để tăng tính đọc hiểu.
#include <stdio.h> #include "myheader.h"
Chỉ thị này bảo CPP lấy stdio.h từ Thư viện hệ thống và thêm vào file nguồn. Dòng sau lấy myheader.h từ thư mục cục bộ và thêm nội dung.
#undef FILE_SIZE #define FILE_SIZE 42
Hủy FILE_SIZE cũ và định nghĩa lại là 42.
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
Định nghĩa MESSAGE chỉ khi MESSAGE chưa được định nghĩa.
#ifdef DEBUG /* Các câu lệnh debug ở đây */ #endif
Xử lý các câu lệnh bên trong nếu DEBUG đã định nghĩa. Hữu ích khi truyền cờ -DDEBUG cho gcc khi biên dịch. Có thể bật/tắt debug nhanh chóng.
Macro định nghĩa sẵn (Predefined Macros)
ANSI C định nghĩa sẵn một số macro. Mặc dù đều dùng được trong lập trình, nhưng không nên sửa đổi trực tiếp.
| STT | Macro & Mô tả |
|---|---|
| 1 | __DATE__ Ngày hiện tại dạng chuỗi "MMM DD YYYY". |
| 2 | __TIME__ Giờ hiện tại dạng chuỗi "HH:MM:SS". |
| 3 | __FILE__ Tên file hiện tại dạng chuỗi. |
| 4 | __LINE__ Số dòng hiện tại dạng hằng số thập phân. |
| 5 | __STDC__ Được định nghĩa là 1 khi trình biên dịch tuân thủ chuẩn ANSI. |
Ví dụ
#include <stdio.h>
int main() {
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );
}
Kết quả
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1