常量声明 (#define, #undef)
编译器使用预处理程序指令在编译之前对源代码进行预处理。这个指令通常以#开始,因此编译器禁止在变量,函数等名称中使用符号。
每个指令都由一个单独的条目描述,并且在换行符之前都是有效的。在一个条目中不能使用多个指令。如果指令条目太大,可以使用'\'符号将其分隔成若干行。 在这种情况下,下一行被认为是指令条目的延续。
#define直接用来指定常量助记名。有两种形式:
#define identifier expression // 无参数形式
#define identifier(par1,... par8) expression // 参数形式#define 直接代替 expression 为在源文件中找出更多的标识符目录。标识符仅代表自己时可被替换。如果标识符是注解一部分,字符串一部分或者其他标识符一部分,则不能代替。
常量标识符与变量名同样规则。值可以是多种类型:
#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");
}expression 由几种标记组成,例如关键字,常量,有常量无常量表达式。expression在直线末端结束,不可转到下一行。
示例:
#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);
}
// 结果
// 2 + 3*2 = 8
// (2 + 3)*2 = 10参数形式 #define
通过参数形式,所有随后发现的标识符条目都将被考虑实际参数的表达式所取代。例如:
// a和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));
*/
// 结果
// c=20
使用参数表达式时一定要在圆括号中附上参数,这将有助于避免不易发现的不明显的错误。如果我们不使用括号重写代码,结果将会有所不同:
// a和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;
*/
// 结果
// c=16使用参数形式时,最多允许8个参数。
// 正确的参数形式
#define LOG(text) Print(__FILE__,"(",__LINE__,") :",text) // 一个参数 - 'text'
// 不正确的参数形式
#define WRONG_DEF(p1, p2, p3, p4, p5, p6, p7, p8, p9) p1+p2+p3+p4 // 从p1到p9的超过8个参数#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();
}
/* Output:
MACRO is defined in func1
MACRO is not defined in func2
*/