Biên dịch có điều kiện (#ifdef, #ifndef, #else, #endif)
Các chỉ thị tiền xử lý được trình biên dịch sử dụng để xử lý trước mã nguồn trước khi biên dịch nó. Chỉ thị luôn bắt đầu bằng #
, do đó trình biên dịch cấm sử dụng ký hiệu này trong tên của các biến, hàm, v.v.
Mỗi chỉ thị được mô tả bằng một mục riêng biệt và có hiệu lực cho đến khi xuống dòng. Bạn không thể sử dụng nhiều chỉ thị trong một mục. Nếu mục chỉ thị quá lớn, nó có thể được chia thành nhiều dòng bằng cách sử dụng ký hiệu ''. Trong trường hợp này, dòng tiếp theo được coi là phần tiếp tục của mục chỉ thị.
Các chỉ thị biên dịch có điều kiện của bộ tiền xử lý cho phép biên dịch hoặc bỏ qua một phần của chương trình tùy thuộc vào việc đáp ứng một điều kiện nhất định.
Điều kiện đó có thể có một trong các dạng sau.
#ifdef identifier
// mã nằm ở đây được biên dịch nếu định danh đã được định nghĩa cho bộ tiền xử lý trong chỉ thị #define.
#endif
2
3
#ifndef identifier
// mã nằm ở đây được biên dịch nếu định danh hiện chưa được định nghĩa bởi chỉ thị #define của bộ tiền xử lý.
#endif
2
3
Bất kỳ chỉ thị biên dịch có điều kiện nào cũng có thể được theo sau bởi bất kỳ số lượng dòng nào, có thể chứa chỉ thị #else và kết thúc bằng #endif. Nếu điều kiện được kiểm tra là đúng, các dòng giữa #else và #endif sẽ bị bỏ qua. Nếu điều kiện được kiểm tra không được đáp ứng, tất cả các dòng giữa phần kiểm tra và chỉ thị #else (hoặc chỉ thị #endif nếu không có #else) sẽ bị bỏ qua.
Ví dụ:
#ifndef TestMode
#define TestMode
#endif
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void `OnStart`()
{
#ifdef TestMode
`Print`(`"Test mode"`);
#else
`Print`(`"Normal mode"`);
#endif
}
2
3
4
5
6
7
8
9
10
11
12
13
14
Tùy thuộc vào loại chương trình và chế độ biên dịch, các macro tiêu chuẩn được định nghĩa như sau:
Macro __MQL5__
được định nghĩa khi biên dịch tệp *.mq5, macro __MQL4__
được định nghĩa khi biên dịch tệp *.mq4.
Macro _DEBUG
được định nghĩa khi biên dịch ở chế độ gỡ lỗi.
Macro _RELEASE
được định nghĩa khi biên dịch ở chế độ phát hành.
Ví dụ:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void `OnStart`()
{
#ifdef `__MQL5__`
#ifdef `_DEBUG`
`Print`(`"Hello from MQL5 compiler [DEBUG]"`);
#else
#ifdef `_RELEASE`
`Print`(`"Hello from MQL5 compiler [RELEASE]"`);
#endif
#endif
#else
#ifdef `__MQL4__`
#ifdef `_DEBUG`
`Print`(`"Hello from MQL4 compiler [DEBUG]"`);
#else
#ifdef `_RELEASE`
`Print`(`"Hello from MQL4 compiler [RELEASE]"`);
#endif
#endif
#endif
#endif
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25