预处理指令(Preprocess)
# 在行首触发预处理指令:编译前按符号条件裁剪源码。适合「同一份代码,编辑器构建多一套调试函数」这类分叉。
条件块
#if EDITOR
func Mode() -> string => "编辑器";
#elif SHIPPING
func Mode() -> string => "shipping";
#else
func Mode() -> string => "默认";
#endif
func main() -> int
{
print(Mode());
return 0;
}默认宿主没定义 EDITOR,按 0/false 走 #else,Mode() 返回「默认」。符号由宿主注入(DefinedSymbols / SymbolValues),CLI 直跑时全部未定义。
指令集
| 指令 | 类别 | 形态 |
|---|---|---|
#if expr | 块状 | 条件块起始(独占整行) |
#elif expr | 块状 | 分支 |
#else / #endif | 块状 | 兜底 / 结束 |
#SYM | 前缀 | 符号已定义 → 激活下一声明/语句 |
#!SYM | 前缀 | 取反 |
#[expr] | 前缀 | 括号表达式 |
前缀形贴在单条声明或语句前,只裁剪那一条:
#DEBUG
public val Verbose: bool = true;未定义符号必警
#if / #elif / 前缀指令里的每个符号,只要不在宿主符号集里,一律 MS1214 警告,该警告确保此类错误可见。数值符号可参与表达式比较(#elif DEBUG >= 2)。
注意
#只在行首触发,行中的#是普通字符。- 预处理发生在编译最前,被裁掉的代码完全不参与解析,分叉两边的语法各自独立成立即可。
最后更新于 2026年10月10日
