Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Macro và Bộ tiền xử lý (Preprocessor) trong C


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