Skip to content

#DEFINE


定义宏的预处理器指令

语法

#define identifier body
#define identifier( [ parameters ] ) body
#define identifier( [ parameters, ] variadic_parameter... ) body

说明

#define 允许声明基于文本的预处理器宏。一旦编译器看到 #define,它将开始把 identifier 的后续出现替换为 bodybody 可以为空。展开是递归进行的,直到没有更多内容可展开,编译器才能继续分析生成的代码。可以使用 #undef 让编译器忘记 #define

参数 将 define 变为类函数的宏,允许将文本参数传递给宏。在展开过程中,body 中出现的参数名称将被替换为给定的参数文本。

如果向宏传递字面量,宏体中对应参数的名称不能像在过程体中那样用作局部变量。为了模拟与过程相同的功能,用户必须在宏体中显式声明一个局部变量(使用另一个名称),并用传递的参数名称(在预处理时被传递的字面量替换)对其进行初始化。

# 字符串化 运算符可用于将宏参数转换为字符串字面量,## 连接 运算符可用于将标记合并在一起。

注意:在类函数的 #define 声明中,identifier 应紧跟开括号 ((),中间没有任何空白,否则编译器会将其视为 body 的一部分。

定义具有_作用域_;它们只在定义它们的作用域中可见。如果在模块级别定义,define 在整个模块中可见。如果 identifier 在具有作用域的复合语句(SubFor..NextWhile..WendDo..LoopScope..End Scope 等)内定义,则 identifier 定义仅在该作用域内可见。另一方面,命名空间对 define 的可见性没有任何影响。

可以使用 #ifdef 和其他指令来检查 Identifier,这可用于对编译器隐藏部分代码(条件编译)。

可以使用 -pp 编译器选项检查宏展开的结果。

#define 常用于声明常量。Const 语句是类型安全的替代方案。

警告:当 define 体包含至少有一个运算符的表达式时,可能必须用括号括住某些项(参数、整个体),以避免运算符优先级发生不期望的变化(如果传递的参数是也有运算符的表达式,或者在也有运算符的主表达式中使用 define)。

示例

start GeSHi

vb
'' 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
#endif

end GeSHi

与 QB 的区别

  • FreeBASIC 新增

另请参阅

  • #macro
  • # 预处理器字符串化
  • ## 预处理器连接
  • #ifdef
  • #undef
  • Const
  • ...

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系