条件编译

条件编译

通过编译标志控制代码包含:

@[if debug ?]  // 仅当v -debug时编译
fn log_debug(msg string) {
    println("[DEBUG] $msg")
}

$if prod ? {  // 分支编译
    println("生产环境")
} $else {
    println("开发环境")
}

应用场景

  1. 创建多版本程序:
v -d client -o client.exe .  # 生成客户端
v -d server -o server.exe .  # 生成服务端
  1. 平台特定代码:
$if windows {
    // Windows专属逻辑
} $if linux {
    // Linux专属逻辑
}

编译时伪变量

运行时替换的元信息:

println(@FILE_LINE)  // 输出: main.v:12
println(@VHASH)      // 编译器版本哈希

完整列表

变量

描述

@FN

当前函数名

@MOD

当前模块名

@VEXEROOT

V编译器安装目录

@VMOD_FILE

v.mod文件内容

@BUILD_TIMESTAMP

编译时间戳(UTC)

编译时反射

类型元编程:

// 结构体字段遍历
$for field in User.fields {
    println("字段: ${field.name} 类型: ${field.typ}")
}

// 枚举值处理
$for value in Color.values {
    println("${value.name}: ${value.attrs}")
}

编译时代码执行

  1. 环境变量读取
path := $env('JAVA_HOME')  // 获取系统变量
  1. 编译标志处理
max_size := $d('cache_size', 1024)  // 默认值1024
  1. 自定义报错
$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时包含