Macro substitution (#define)
宏替换 (#define, #undef)
#define 指令可用于为常量分配助记符名称。有两种形式:
#define identifier expression // parameter-free form
#define identifier(par1,... par8) expression // parametric form
#define 指令将表达式替换为源文本中所有出现的标识符。只有当标识符是独立的词元时才会被替换。如果标识符是注释的一部分、字符串的一部分或另一个更长的标识符的一部分,则不会被替换。
常量标识符遵循与变量名称相同的规则。其值可以是任何类型:
#define ABC 100
#define PI 3.14
#define COMPANY_NAME "MetaQuotes Software Corp."
...
void ShowCopyright()
{
Print("Copyright 2001-2013, ",COMPANY_NAME);
Print("https://www.metaquotes.net");
}表达式可以由多个词元组成,如关键字、常量、常量和非常量表达式。表达式以换行符结束,不能转移到下一行。
示例:
#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);
}
// Result
// 2 + 3*2 = 8
// (2 + 3)*2 = 10
参数化形式 #define
使用参数化形式时,所有后续出现的标识符都将根据实际参数被替换。例如:
// example with two parameters a and b
#define A 2+3
#define B 5-1
#define MUL(a, b) ((a)*(b))
double c=MUL(A,B);
Print("c=",c);
/*
expression double c=MUL(A,B);
is equivalent to double c=((2+3)*(5-1));
*/
// Result
// c=20
在表达式中使用参数时,必须将其放在括号内,这有助于避免难以发现的非明显错误。如果我们不使用括号重写代码,结果将会不同:
// example with two parameters a and b
#define A 2+3
#define B 5-1
#define MUL(a, b) a*b
double c=MUL(A,B);
Print("c=",c);
/*
expression double c=MUL(A,B);
is equivalent to double c=2+3*5-1;
*/
// Result
// c=16
使用参数化形式时,最多允许使用8个参数。
// correct parametric form
#define LOG(text) Print(__FILE__,"(",__LINE__,") :",text) // one parameter - 'text'
// incorrect parametric form
#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9) p1+p2+p3+p4 // more than 8 parameters from p1 to p9
#undef 指令
#undef 指令取消之前定义的宏替换的声明。
示例:
#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();
}
/* Result:
MACRO is defined in func1
MACRO is not defined in func2
*/另请参阅
最后更新于