V语言学习笔记-25条件编译

条件编译

目前主要针对不同平台,实现条件编译

按照作者的说法,为了保持V的简单,不会加入预处理,但是支持条件编译

目前的条件编译有2种主要方式:

1.根据源文件名后缀来实现条件编译

2.根据代码中的$if来实现条件编译

源文件后缀名方式

源文件后缀包含了2个维度的条件编译:

  • 通用源文件

    后缀名 编译条件
    只有 .v 所有操作系统,所有后端都参与编译
  • 操作系统(os)

    后缀名 编译条件
    _nix linux,unix,mac,solaris下才会参与编译,或者说是非windows
    _darwin mac下才会参与编译
    _linux linux下才会参与编译
    _solaris solaris下才会参与编译
    _windows windows下才会参与编译
    _bare 编译成裸机(metal)环境运行代码,才会参与编译,不进行排列组合
  • 编译器后端(backend)

    后缀名 编译器后端
    .c C语言为编译器后端时才会参与编译
    .js js语言为编译器后端时才会参与编译
    .x64 直接生成x64机器码时才会参与编译

    以上2个维度排列组合:

    file.v
    file_linux.c.v
    file_windows.c.v
    file_windows.js.v
    ...
    

源代码中的$if方式

$if windows {
    println('windows')
    $if msvc { //可以在windows平台中,进一步判断是msvc还是mingw
        
    }
    $if mingw { //可以在windows平台中,进一步判断是msvc还是mingw
        
    }
}
$if linux {
    println('linux')
}
$if macos {
    println('mac')
}

$if windows {
    
} $else { //用来处理$if以外,其他平台的代码
    
}
$if !windows { //还可以使用!,取否
    
}

判断是否使用了-debug

$if debug {
    println('from debug')
}
//执行:
//v run main.v -debug

判断平台是32位还是64位

fn main() {
    mut x := 0
    $if x32 {
        println('system is 32 bit')
        x = 1
    }
    $if x64 {
        println('system is 64 bit')
        x = 2
    }
}

判断平台使用的字节序是小字节序,还是大字节序

fn main() {
    mut x := 0
    $if little_endian { //小字节序
        println('system is little endian')
        x = 1
    }
    $if big_endian { //大字节序
        println('system is big endian')
        x = 2
    }
}

跨平台交叉编译

编译器有一个选项-os用来编译生成指定平台的可执行文件

目前可以是:linux, mac, windows, msvc

v -os linux ./main.v
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。