跳至内容

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
*/

另请参阅

标识符, 字符常量

最后更新于