这是Go+项目的一个子项目。其目标是将任何 C 项目转换为 Go,无需任何人工干预,并保持接近 C 的性能。
让它通过。阶段:Done Almost. 我们已经编译了libc(正在进行)和sqlite3(完成)。使其正确。阶段:Doing. 我们移植libc-test来测试c2go和libc。覆盖范围:快一点。阶段:Planning.如何运行示例?运行一个例子:

运行/测试多个示例:
运行示例:c2go ./...测试示例:c2go -test ./...c2go 在 Go+ 中如何使用这是一个示例,展示 Go+ 如何与 C 交互。

import "C"C.printf C"Hello, c2go!\n"C.fprintf C.stderr, C"Hi, %7.1f\n", 3.14
这里我们使用import "C"导入libc。它是 的缩写import "C/github.com/goplus/libc"。它相当于下面的代码:
import "C/github.com/goplus/libc"C.printf C"Hello, c2go!\n"C.fprintf C.stderr, C"Hi, %7.1f\n", 3.14
在此示例中,我们调用两个 C 标准函数printf和,以(表示 C 风格字符串的 Go+ 语法)的形式fprintf传递一个 C 变量和两个 C 字符串。stderrC"xxx"
运行gop run .查看此示例的输出:
Hello, c2go!Hi, 3.1
测试平台苹果系统:11.xLinux:ubuntu-20.04(暂时跳过testdata/qsort)支持的 C 语法数据结构空白:void布尔值:_Bool,bool整数:[ signed/ unsigned] [ short/ long/ long long]int枚举:enum浮动:float, double,long double字符:[ signed/ unsigned]char复杂:_Complex float//doublelong double类型定义:typedef指针:T,T[]数组:T[N], T[]数组指针:T()[N]函数指针:T ()(T1, T2, ...)结构:struct联盟:union位域:intType :N运算符算术:a+b、ab、ab、a/b、a%b、-a、+a递增/递减:a++、a--、++a、--a比较:a<b、a<=b、a>b、a>=b、a==b、a!=b逻辑:a&&b、a||b、!a按位:a|b、a&b、a^b、~a、a<<n、a>>n指针算术:p+n、pn、pq、p++、p--任务:=操作员分配: a <op>=b位域分配:=位域运算符分配: a <op>=b结构/联合/位字段成员:ab数组成员:a[n]指针成员:&a、p、p[n]、n[p]、p->b逗号:a,b三元条件:cond?a:b函数调用:f(a1, a2, ...)转换:(T)a尺寸:尺寸(T),尺寸(a)偏移量: __builtin_offsetof(T, 成员)文字布尔值、整数浮点数,复虚数字符、字符串大批:(T[]){ expr1, expr2, ... }数组指针:&(T[]){ expr1, expr2, ... }结构:struct T{ expr1, expr2, ... }初始化基本的:T a = expr数组:T a[] = { expr1, expr2, ... },T a[N] = { expr1, expr2, ... }结构:struct T a = { expr1, expr2, ... },struct T a = { .a = expr1, .b = expr2, ... }联盟:union T a = { expr }, union T a = { .a = expr }结构体中的数组:struct { T a[N]; ... } v = { { expr1, expr2, ... }, ... },struct { T a[N]; ... } v = { { [0].a = expr1, [1].a = expr2, ... }, ... }控制结构如果:if (cond) stmt1 [else stmt2]转变:switch (tag) { case expr1: stmt1 case expr2: stmt2 default: stmtN }为了:for (init; cond; post) stmt尽管:while (cond) stmt执行同时:do stmt while (cond)中断/继续:break,continue去:goto label功能参数可变参数可变参数访问返回项目地址:
https://github.com/goplus/c2go