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

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

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

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

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

  • 通用源文件

    | 后缀名 | 编译条件 | | ———- | ———————————————- | | 只有 .v | 所有操作系统,所有后端都参与编译 |

  • | 后缀名 | 编译条件 | | :———————- | —————————————————————————————— | | _default | 默认的,表示所有操作系统都参与编译,比如file_default.c.v.同个目录中,如果同时存在默认的和平台特有的,平台特有的文件会参与编译,默认的被忽略 | | _nix | linux,unix,darwin,solaris下才会参与编译,或者说是非windows | | _macos或 _darwin | mac下才会参与编译 | | _linux | linux下才会参与编译 | | _solaris | solaris下才会参与编译 | | _windows | windows下才会参与编译 | | _android | android平台下才会参与编译 | | _ios | ios平台下才会参与编译 | | _bare | 编译成裸机(metal)环境运行代码,才会参与编译,不进行排列组合 |

  • 编译器后端(backend)

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

    以上2个维度排列组合:

$if条件编译

以下表格是所有可以在编译时进行条件判断的变量:

  1. $if windows {
  2. println('windows')
  3. $if msvc { // 可以在windows平台中,进一步判断是msvc还是mingw
  4. }
  5. $if mingw { // 可以在windows平台中,进一步判断是msvc还是mingw
  6. }
  7. }
  8. $if linux {
  9. println('linux')
  10. }
  11. $if macos { // 或者mac
  12. println('mac')
  13. }
  14. $if windows {
  15. } $else $if macos { // else if分支
  16. println('macos')
  17. println('linux')
  18. } $else { // else分支
  19. println('others')
  20. }
  21. $if !windows { // 使用非运算
  22. }
  23. $if linux || macos { // 使用或运算符
  24. }
  25. $if linux && x64 { // 使用且运算符
  26. }
  27. // 其他条件编译的选项有:
  28. // freebsd,openbsd,netbsd,bsd,dragonfly,android,solaris
  29. // js,tinyc,clang,msvc,mingw
  30. }

识别自定义编译选项

  1. $if abc ? { //abc是自定义的编译选项,在条件编译时可以判断是否时候了自定义选项
  2. println('自定义选项abc存在')
  3. //执行 v -d abc
  4. //或者 v -define abc

判断是否使用了-cg,进入调试模式

  1. fn test_comptime_if_test() {
  2. mut i := 0
  3. $if test { //如果在测试函数中,则执行
  4. i++
  5. }
  6. i--
  7. }
  8. assert i == 1
  9. }

判断平台是32位还是64位

  1. fn main() {
  2. mut x := 0
  3. $if x32 {
  4. println('system is 32 bit')
  5. x = 1
  6. }
  7. $if x64 {
  8. println('system is 64 bit')
  9. x = 2
  10. }
  11. }

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

判断是否-prod生产编译

  1. fn main() {
  2. $if prod {
  3. println('prod')
  4. } $else {
  5. println('not prod')
  6. }
  7. }

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

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

  1. v -os linux ./main.v

编译器中内置了开发和测试时需要的几个全局变量,方便编译,测试使用:

另外,如果需要进一步解析v.mod的文件内容,可以导入v.mod模块,这个模块就是用来解析v.mod的

  1. import v.vmod