#DEFINE
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgPpdefine
- 最后更新: 2020-11-20
定义宏的预处理器指令
语法
#define identifier body
#define identifier( [ parameters ] ) body
#define identifier( [ parameters, ] variadic_parameter... ) body说明
#define 允许声明基于文本的预处理器宏。一旦编译器看到 #define,它将开始把 identifier 的后续出现替换为 body。body 可以为空。展开是递归进行的,直到没有更多内容可展开,编译器才能继续分析生成的代码。可以使用 #undef 让编译器忘记 #define。
参数 将 define 变为类函数的宏,允许将文本参数传递给宏。在展开过程中,body 中出现的参数名称将被替换为给定的参数文本。
如果向宏传递字面量,宏体中对应参数的名称不能像在过程体中那样用作局部变量。为了模拟与过程相同的功能,用户必须在宏体中显式声明一个局部变量(使用另一个名称),并用传递的参数名称(在预处理时被传递的字面量替换)对其进行初始化。
# 字符串化 运算符可用于将宏参数转换为字符串字面量,## 连接 运算符可用于将标记合并在一起。
注意:在类函数的 #define 声明中,identifier 应紧跟开括号 ((),中间没有任何空白,否则编译器会将其视为 body 的一部分。
定义具有_作用域_;它们只在定义它们的作用域中可见。如果在模块级别定义,define 在整个模块中可见。如果 identifier 在具有作用域的复合语句(Sub、For..Next、While..Wend、Do..Loop、Scope..End Scope 等)内定义,则 identifier 定义仅在该作用域内可见。另一方面,命名空间对 define 的可见性没有任何影响。
可以使用 #ifdef 和其他指令来检查 Identifier,这可用于对编译器隐藏部分代码(条件编译)。
可以使用 -pp 编译器选项检查宏展开的结果。
#define 常用于声明常量。Const 语句是类型安全的替代方案。
警告:当 define 体包含至少有一个运算符的表达式时,可能必须用括号括住某些项(参数、整个体),以避免运算符优先级发生不期望的变化(如果传递的参数是也有运算符的表达式,或者在也有运算符的主表达式中使用 define)。
示例
start GeSHi
'' Definition and check
#define DEBUGGING
#ifdef DEBUGGING
' ... statements
#endif
'' Simple definition/text replacement
#define FALSE 0
#define TRUE (Not FALSE)
'' Function-like definition
#define MyRGB(R,G,B) (((R)Shl 16) Or ((G)Shl 8) Or (B))
Print Hex( MyRGB(&hff, &h00, &hff) )
'' Line continuation and statements in a definition
#define printval(bar) _
Print #bar; " ="; bar
'' #defines are visible only in the scope where they are defined
Scope
#define LOCALDEF 1
End Scope
#ifndef LOCALDEF
# Print LOCALDEF Is Not defined
#endif
'' namespaces have no effect on the visibility of a define
Namespace foo
# define NSDEF
End Namespace
#ifdef NSDEF
# Print NSDEF Is defined
#endifend GeSHi
与 QB 的区别
- FreeBASIC 新增
另请参阅
#macro# 预处理器字符串化## 预处理器连接#ifdef#undefConst...
返回 目录