条件编译
条件编译
通过编译标志控制代码包含:
@[if debug ?] // 仅当v -debug时编译
fn log_debug(msg string) {
println("[DEBUG] $msg")
}
$if prod ? { // 分支编译
println("生产环境")
} $else {
println("开发环境")
}
应用场景:
- 创建多版本程序:
v -d client -o client.exe . # 生成客户端
v -d server -o server.exe . # 生成服务端
- 平台特定代码:
$if windows {
// Windows专属逻辑
} $if linux {
// Linux专属逻辑
}
编译时伪变量
运行时替换的元信息:
println(@FILE_LINE) // 输出: main.v:12
println(@VHASH) // 编译器版本哈希
完整列表:
变量 | 描述 |
| 当前函数名 |
| 当前模块名 |
| V编译器安装目录 |
| v.mod文件内容 |
| 编译时间戳(UTC) |
编译时反射
类型元编程:
// 结构体字段遍历
$for field in User.fields {
println("字段: ${field.name} 类型: ${field.typ}")
}
// 枚举值处理
$for value in Color.values {
println("${value.name}: ${value.attrs}")
}
编译时代码执行
- 环境变量读取:
path := $env('JAVA_HOME') // 获取系统变量
- 编译标志处理:
max_size := $d('cache_size', 1024) // 默认值1024
- 自定义报错:
$if js {
$compile_error("不支持JS环境")
}
文件嵌入
// 嵌入资源文件
logo := $embed_file("logo.png")
// 运行时写入
os.write_file("logo.png", logo.to_string())!
压缩选项:
css := $embed_file("styles.css", .zlib) // 启用zlib压缩
模板引擎
// 模板文件内容
data := {
'name': "Alice",
'items': [1,2,3]
}
html := $tmpl("template.html") // 自动替换@name等占位符
编译时类型
类型系统增强检查:
fn process[T](data T) {
$if T is $string {
println("字符串处理: $data")
} $if T is $array {
println("数组长度: ${data.len}")
}
}
环境特定文件
文件命名规则:
main_linux.c.v # 仅Linux编译
ui_windows.c.v # 仅Windows编译
util_demo.v # v -d demo时包含
util_notdemo.v # 未启用demo时包含