Computer >> Máy Tính >  >> Lập trình >> C ++

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

C Preprocessor không phải là một phần của trình biên dịch, nhưng là một bước riêng biệt trong quá trình biên dịch. Nói một cách dễ hiểu, C Preprocessor chỉ là một công cụ thay thế văn bản và nó hướng dẫn trình biên dịch thực hiện xử lý trước cần thiết trước khi biên dịch thực sự. Chúng tôi sẽ gọi Bộ tiền xử lý C là CPP.

Tất cả các lệnh tiền xử lý bắt đầu bằng ký hiệu băm (#). Nó phải là ký tự không trống đầu tiên và để dễ đọc, chỉ thị tiền xử lý phải bắt đầu trong cột đầu tiên. Phần sau liệt kê tất cả các chỉ thị quan trọng của bộ xử lý trước -

Sr.No Chỉ dẫn &Mô tả
1 #define
Thay thế macro bộ xử lý trước.
2 #include
Chèn một tiêu đề cụ thể từ một tệp khác.
3 #undef
Hoàn tác xác định macro bộ xử lý trước.
4 #ifdef
Trả về true nếu macro này được xác định.
5 #ifndef
Trả về true nếu macro này không được xác định.
6 #if
Kiểm tra xem điều kiện thời gian biên dịch có đúng không.
7 #else
Giải pháp thay thế cho #if.
8 #elif
#else và #if trong một câu lệnh.
9 #endif
Kết thúc tiền xử lý có điều kiện.
10 #error
In thông báo lỗi trên stderr.
11 #pragma
Đưa ra các lệnh đặc biệt cho trình biên dịch, sử dụng một phương pháp đã được chuẩn hóa.

Một số ví dụ về Bộ tiền xử lý -

Phân tích các ví dụ sau để hiểu các lệnh khác nhau.

#define MAX_ARRAY_LENGTH 20

Lệnh này yêu cầu CPP thay thế các phiên bản của MAX_ARRAY_LENGTH bằng 20. Sử dụng #define cho các hằng số để tăng khả năng đọc.

#include <stdio.h>
#include "myheader.h"

Các chỉ thị này yêu cầu CPP nhận stdio.h từ Thư viện hệ thống và thêm văn bản vào tệp nguồn hiện tại. Dòng tiếp theo yêu cầu CPP nhận myheader.h từ thư mục cục bộ và thêm nội dung vào tệp nguồn hiện tại.

#undef FILE_SIZE
#define FILE_SIZE 42

Nó yêu cầu CPP hủy xác định FILE_SIZE hiện có và xác định nó là 42.

#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif

Nó yêu cầu CPP xác định MESSAGE chỉ khi MESSAGE chưa được xác định.

#ifdef DEBUG
/* Your debugging statements here */
#endif

Nó yêu cầu CPP xử lý các câu lệnh kèm theo nếu DEBUG được xác định. Điều này rất hữu ích nếu bạn chuyển cờ -DDEBUG cho trình biên dịch gcc tại thời điểm biên dịch. Điều này sẽ xác định Gỡ lỗi, vì vậy bạn có thể bật và tắt gỡ lỗi ngay lập tức trong quá trình biên dịch.

Macro được xác định trước -

ANSI C xác định một số macro. Mặc dù mỗi cái đều có sẵn để sử dụng trong lập trình, bạn không nên sửa đổi trực tiếp các macro được xác định trước.

Sr.No Macro &Mô tả
1 __DATE__
Ngày hiện tại dưới dạng một ký tự ở định dạng "MMM DD YYYY".
2 __TIME__
Thời gian hiện tại dưới dạng một ký tự ở định dạng "HH:MM:SS".
3 __FILE__
Điều này chứa tên tệp hiện tại dưới dạng một chuỗi ký tự.
4 __LINE__
Điều này chứa số dòng hiện tại dưới dạng hằng số thập phân.
5 __STDC__
Được xác định là 1 khi trình biên dịch tuân thủ tiêu 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__ );
}

Đầu ra

File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1