/ *g ọi hàm g() biến b được cấp phát
Bài 3 6 Biên dịch có điều kiện
Tóm tắt nội dung:
Các chỉ thị biên dich có điều kiện #if, #ifdef, #ifndef dùng để hướng dẫn quá trình biên dịch có thể dịch hay bỏ qua một số câu lệnh theo một điều kiện chỉ ra.
Thời lượng: 1 tiết
Biên dich có điều kiện là điều khiển quá trình biên dịch sẽ thực hiện dịch hay bỏ qua một số câu lệnh trong chương trình theo một điều kiện nào đó. Xét một ví dụ sau:
#if !define(PI) #define PI 3.14 #endif
Trong đoạn chương trình chỉ thị #define chỉ được dịch khi việc kiểm tra hằng số PI chưa được định nghĩa. Điều đó đảm bảo tính logic trong khi dịch chương trình là hằng số PI chỉ cần định nghĩa khi nó chưa được định nghĩa trước đó.
#if <biểu thức hằng>
[#else] [#elif]
#endif
Chỉ thị #elif tương đương như #else kết hợp với #if. Một trong những cách sử dụng thông thường của #if là:
#ifdef <name> /* viết tắt của #if define(<name>) */ #ifndef <name> /* viết tắt của #if !define(<name>) */
Ví dụ:
/* kiểm tra xem có phải chương trình được dich bởi Turbo C */ #ifdef TURBOC
/* nếu đúng kích thước của int là 2 byte */ #define INT_SIZE 16 #define INT_SIZE 16
#else
/* kích thước của int trên Unix là 4 byte */ #define INT_SIZE 32
#endif
Trong nhiều chương trình khi được thiết kế để chỉ chạy trên một hệ điều hành nhất định, ta thường thêm một đoạn kiểm tra để dừng biên dịch nếu chương trình được dịch trên một hệ điều hành khác thiết kế.
Ví dụ:
#if SYSTEM != MSDOS
#error Program only run on MSDOS #endif
Biên dịch có điều kiện cịn giúp cho việc tạo một chương trình mà có thể dịch thành hai phiên bản: có gỡ rối (debug) và khơng có gỡ rối.
Ví dụ: #ifdef DEBUG printf("Debugging Version\n"); #endif int x, y; x = y *3; #ifdef DEBUG
printf("Debugging: Variables (x=%d, y=%d)\n",x,y); #endif
Khi muốn tạo phiên bản có debug thì ta chỉ cần thêm định nghĩa #define DEBUG ở ngay dịng đầu tiên của chương trình. Làm như vậy thì tất cả các lệnh in giá trị của các biến thay đổi từng bước sẽ có mặt trong chương trình giúp chúng ta lần bước được sự hoạt động của chương trình. Khi khơng cịn cần gỡ rối nữa thì ta chỉ việc bỏ #define DEBUG đi để biên dich có điều kiện loại bỏ tất cả các lệnh in giá trị lần bước trong chương trình