Thay thế Macro (#define)
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ị.
Chỉ thị #define
có thể được sử dụng để gán tên mnemonic cho các hằng số. Có hai dạng:
#define identifier expression // dạng không tham số
#define identifier(par1,... par8) expression // dạng có tham số
2
Chỉ thị #define
thay thế expression
cho tất cả các mục identifier
được tìm thấy sau đó trong văn bản nguồn. identifier
chỉ được thay thế nếu nó là một token riêng biệt. identifier
không được thay thế nếu nó là một phần của chú thích, một phần của chuỗi, hoặc một phần của một định danh dài hơn khác.
Định danh hằng số tuân theo cùng các quy tắc như tên biến. Giá trị có thể thuộc bất kỳ kiểu nào:
#define ABC 100
#define PI 3.14
#define COMPANY_NAME `"MetaQuotes Software Corp."`
...
void ShowCopyright()
{
`Print`(`"Copyright 2001-2009, "`,COMPANY_NAME);
`Print`(`"https://www.metaquotes.net"`);
}
2
3
4
5
6
7
8
9
expression
có thể bao gồm nhiều token, chẳng hạn như từ khóa, hằng số, biểu thức hằng và không hằng. expression
kết thúc ở cuối dòng và không thể chuyển sang dòng tiếp theo.
Ví dụ:
#define TWO 2
#define THREE 3
#define INCOMPLETE TWO+THREE
#define COMPLETE (TWO+THREE)
void `OnStart`()
{
`Print`(`"2 + 3*2 = "`,INCOMPLETE*2);
`Print`(`"(2 + 3)*2 = "`,COMPLETE*2);
}
// Kết quả
// 2 + 3*2 = 8
// (2 + 3)*2 = 10
2
3
4
5
6
7
8
9
10
11
12
Dạng tham số #define
Với dạng tham số, tất cả các mục định danh được tìm thấy sau đó sẽ được thay thế bằng biểu thức dựa trên các tham số thực tế. Ví dụ:
// ví dụ với hai tham số a và b
#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))
double c=MUL(A,B);
`Print`(`"c="`,c);
/*
biểu thức double c=MUL(A,B);
tương đương với double c=((2+3)*(5-1));
*/
// Kết quả
// c=20
2
3
4
5
6
7
8
9
10
11
12
13
Hãy đảm bảo đặt các tham số trong dấu ngoặc khi sử dụng tham số trong biểu thức, vì điều này sẽ giúp tránh các lỗi không rõ ràng và khó tìm. Nếu chúng ta viết lại mã mà không sử dụng dấu ngoặc, kết quả sẽ khác:
// ví dụ với hai tham số a và b
#define A 2+3
#define B 5-1
#define MUL(a, b) a*b
double c=MUL(A,B);
`Print`(`"c="`,c);
/*
biểu thức double c=MUL(A,B);
tương đương với double c=2+3*5-1;
*/
// Kết quả
// c=16
2
3
4
5
6
7
8
9
10
11
12
13
Khi sử dụng dạng tham số, tối đa 8 tham số được phép.
// dạng tham số đúng
#define `LOG`(text) `Print`(`__FILE__`,`"("`,`__LINE__`,`") :"`,text) // một tham số - 'text'
// dạng tham số sai
#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9) p1+p2+p3+p4 // hơn 8 tham số từ p1 đến p9
2
3
4
5
Chỉ thị #undef
Chỉ thị #undef
hủy bỏ khai báo thay thế macro đã được định nghĩa trước đó.
Ví dụ:
#define MACRO
void func1()
{
#ifdef MACRO
`Print`(`"MACRO is defined in "`,`__FUNCTION__`);
#else
`Print`(`"MACRO is not defined in "`,`__FUNCTION__`);
#endif
}
#undef MACRO
void func2()
{
#ifdef MACRO
`Print`(`"MACRO is defined in "`,`__FUNCTION__`);
#else
`Print`(`"MACRO is not defined in "`,`__FUNCTION__`);
#endif
}
void `OnStart`()
{
func1();
func2();
}
/* Kết quả:
MACRO is defined in func1
MACRO is not defined in func2
*/
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Xem thêm