Skip to main content

V Reference

内存管理#

  • -autofree - v0.3 默认开启 - 不开启可能会泄漏内存
  • -manualfree, [manualfree]
  • -prealloc
struct MyType {}
[unsafe]fn (data &MyType) free() {    // 自定义 free 逻辑}

C 交互#

vc
voidptrvoid*
&bytebyte*
&charchar*
&&charchar**
// -I,-L,-l,-D#flag -lsqlite3#include "sqlite3.h"
// 环境区分#flag linux -lsdl2
// 使用 pkgconfig 生成 flag - PKG_CONFIG_PATH#pkgconfig r_core#pkgconfig --cflags --libs r_core
struct C.sqlite3 {}
struct C.sqlite3_stmt {}
type FnSqlite3Callback = fn (voidptr, int, &&char, &&char) intfn C.sqlite3_open(&char, &&C.sqlite3) intfn C.sqlite3_close(&C.sqlite3) int

fn main(){  // null 结尾字符串转 v string - 字符串可能需要 dup 使用 cstring_to_vstring(cstring)  unsafe { &char(cstring).vstring() }  // 已知长度转 string  unsafe { &char(cstring).vstring_with_len(len) }  // windows wide 转字符串 string_from_wide(&u16(cwidestring))}

可直接包含 c 代码, 在 v.mod 添加

#flag -I @VMODROOT/c#flag @VMODROOT/c/implementation.o#include "header.h"

@VMODROOT 会被自动替换为最近的 parent module

C 转 V#

v translate test.c# 生成 wrapperv wrapper c_code/libsodium/src/libsodium

汇编#

a := 100b := 20mut c := 0asm amd64 {    mov eax, a    add eax, b    mov c, eax    ; =r (c) as c // output    ; r (a) as a // input      r (b) as b}println('a: $a') // 100println('b: $b') // 20println('c: $c') // 120