预处理器指令定义宏
语法
#define identifier body
#define identifier ( [ parameters ] ) body
#define identifier ( [ parameters , ] Variadic_Parameter... ) body
说明
#define允许声明基于文本的预处理器宏。一旦编译器看到
#define,它将开始用
body 替换更多的
identifier .
body 可能为空。扩展是递归完成的,直到没有更多的扩展,编译器可以继续分析生成的代码。
#undef可以用于使编译器忘记
#define.
Parameters 将define转换为类似函数的宏,允许将文本参数传递给宏。
body 中的任何参数名称的出现将在扩展期间由给定的参数文本替换。可以使用
# Stringize操作符将宏参数转换成字符串文字,
## Concatenate操作符可用于将令牌合并在一起。
注意:在类似函数的宏声明中,
identifier 之后应该是开始的括号(
(),之间不会有任何空格,否则编译器会将其视为
body 的一部分。
定义是
scoped ;它们只在它们定义的范围内可见。如果在模块级别定义,定义在整个模块中是可见的。如果在具有范围(
Sub,
For..Next,
While..Wend,
Do..Loop,
Scope..End Scope等)的复合语句中定义了
identifier ,则
identifier 定义仅在该范围内可见。另一方面,命名空间对define的可见性没有任何影响。
可以使用
#ifdef和其他人检查
Identifier ,这些可用于从编译器中隐藏代码部分(条件编译)。
可以使用
-pp编译器选项检查宏扩展的结果。
#define通常用于声明常量。
Const语句是一种类型安全的替代方法。
例子
''定义和检查
#define DEBUGGING
#ifdef DEBUGGING
'...声明
#endif
''简单的定义/文本替换
#define FALSE 0
#define TRUE (Not FALSE)
''类似功能的定义
#define MyRGB(R,G,B) (((R)Shl 16) Or ((G)Shl 8) Or (B))
Print Hex( MyRGB(&hff, &h00, &hff) )
''行延续和定义中的语句
#define printval(bar) _
Print #bar; "="; bar
''#define仅在定义范围内才可见
Scope
#define LOCALDEF 1
End Scope
#ifndef LOCALDEF
# Print LOCALDEF Is Not defined
#endif
''命名空间对define的可见性没有影响
Namespace foo
# define NSDEF
End Namespace
#ifdef NSDEF
# Print NSDEF Is defined
#endif
与QB差别
参考