Biên dịch có điều kiện (#ifdef/#ifndef/#else/#endif)
Các chỉ thị biên dịch có điều kiện cho phép bạn bao gồm hoặc loại bỏ các đoạn mã khỏi quá trình biên dịch. Các chỉ thị #ifdef
và #ifndef
đánh dấu sự bắt đầu của đoạn mã mà chúng kiểm soát. Đoạn mã kết thúc bằng chỉ thị #endif
. Trong trường hợp đơn giản nhất, cú pháp của #ifdef
như sau:
#ifdef macro_identifier
statements
#endif
2
3
Nếu một macro với định danh được chỉ định đã được định nghĩa ở trên trong mã bằng #define
, thì đoạn mã này sẽ tham gia vào quá trình biên dịch. Ngược lại, nó sẽ bị loại bỏ. Ngoài các macro được định nghĩa trong mã ứng dụng, môi trường cung cấp một tập hợp các hằng số được định nghĩa sẵn, đặc biệt là các cờ _RELEASE
và _DEBUG
(xem phần Hằng số được định nghĩa sẵn): tên của chúng cũng có thể được kiểm tra trong các chỉ thị biên dịch có điều kiện.
Dạng mở rộng của #ifdef
cho phép chỉ định hai đoạn mã: đoạn đầu tiên sẽ được bao gồm nếu định danh macro được định nghĩa, và đoạn thứ hai sẽ được bao gồm nếu nó không được định nghĩa. Để làm điều này, một bộ phân tách đoạn #else
được chèn giữa #ifdef
và #endif
.
#ifdef macro_identifier
statesments_true
#else
statements_false
#endif
2
3
4
5
Chỉ thị #ifndef
hoạt động tương tự, nhưng các đoạn mã được bao gồm và loại bỏ theo logic ngược lại: nếu macro được chỉ định trong tiêu đề không được định nghĩa, đoạn mã đầu tiên được biên dịch, và nếu nó được định nghĩa, đoạn mã thứ hai được biên dịch.
Ví dụ, tùy thuộc vào sự hiện diện của thay thế macro DEMO
, chúng ta có thể gọi hoặc không gọi hàm tính toán số Fibonacci.
#ifdef DEMO
Print("Fibo is disabled in the demo");
#else
FillFibo();
#endif
2
3
4
5
Trong trường hợp này, nếu chế độ DEMO
được kích hoạt, thay vì gọi hàm, một thông báo sẽ được hiển thị trong nhật ký, nhưng vì trong script Preprocessor.mq5
và tất cả các tệp được bao gồm không có định nghĩa #define DEMO
, quá trình biên dịch sẽ theo nhánh #else
, tức là lời gọi đến hàm FillFibo
sẽ được đưa vào tệp thực thi .ex5
.
Các chỉ thị có thể được lồng nhau.
#ifdef _DEBUG
Print("Debugging");
#else
#ifdef _RELEASE
Print("Normal run");
#else
Print("Undefined mode!");
#endif
#endif
2
3
4
5
6
7
8
9