c2go alternatives and similar packages
Based on the "Go Compilers" category.
Alternatively, view c2go alternatives based on common mentions on social networks and blogs.
-
Hi.Events
Open-source event management and ticket selling platform. Perfect for concerts, conferences, and everything in between 🎟️ -
android-go
The android-go project provides a platform for writing native Android apps in Go programming language.
CodeRabbit: AI Code Reviews for Developers

Do you think we are missing an alternative of c2go or a related project?
Popular Comparisons
README
c2go - Convert C to Go
This is a subproject of the Go+ project. Its goal is converting any C project into Go without any human intervention and keeping performance close to C.
- Make it passed. Stage:
Done Almost
. We have compiled libc (in progress) and sqlite3 (done). - Make it correct. Stage:
Doing
. We portedlibc-test
to test c2go and libc. Coverage: - Make it fast. Stage:
Planning
.
How to run examples?
Run an example:
- Build c2go tools:
go install -v ./...
- Go
testdata/xxx
directory, and runc2go .
Run/Test multiple examples:
- Run examples:
c2go ./...
- Test examples:
c2go -test ./...
How c2go is used in Go+
Here is an example to show how Go+ interacts with C.
import "C"
C.printf C"Hello, c2go!\n"
C.fprintf C.stderr, C"Hi, %7.1f\n", 3.14
Here we use import "C"
to import libc. It's an abbreviation for import "C/github.com/goplus/libc"
. It is equivalent to the following code:
import "C/github.com/goplus/libc"
C.printf C"Hello, c2go!\n"
C.fprintf C.stderr, C"Hi, %7.1f\n", 3.14
In this example we call two C standard functions printf
and fprintf
, passing a C variable stderr
and two C strings in the form of C"xxx"
(a Go+ syntax to represent C style strings).
Run gop run .
to see the output of this example:
Hello, c2go!
Hi, 3.1
What's our plan?
- First, support most of the syntax of C. Stage:
Done Almost
, see supported C syntax. - Second, compile
sqlite3
to fix c2go bugs and get list of its dependent C standard libary fuctions. Stage:Done
, see github.com/goplus/sqlite and its dependent fuctions. - Third, support most of C standard library functions (especially that used by
sqlite3
), and can import them by Go+. Stage:Doing
, see detailed progress here. - Last, support all custom libraries, especially those well-known open source libraries. Stage:
Planning
.
Tested Platform
- [x] MacOS: 1.17.x
- [x] Linux: ubuntu-20.04 (temporarily skip
testdata/qsort
) - [ ] Windows
Supported C syntax
Data structures
- [x] Void:
void
- [x] Boolean:
_Bool
,bool
- [x] Integer: [
signed
/unsigned
] [short
/long
/long long
]int
- [x] Enum:
enum
- [x] Float:
float
,double
,long double
- [x] Character: [
signed
/unsigned
]char
- [ ] Wide Character:
wchar_t
- [ ] Large Integer: [
signed
/unsigned
]__int128
- [x] Complex:
_Complex
float
/double
/long double
- [x] Typedef:
typedef
- [x] Pointer: *T, T[]
- [x] Array: T[N], T[]
- [x] Array Pointer: T(*)[N]
- [x] Function Pointer: T (*)(T1, T2, ...)
- [x] Struct:
struct
- [x] Union:
union
- [x] BitField:
intType :N
Operators
- [x] Arithmetic: a+b, a-b, a*b, a/b, a%b, -a, +a
- [x] Increment/Decrement: a++, a--, ++a, --a
- [x] Comparison: ab, a>=b, a==b, a!=b
- [x] Logical: a&&b, a||b, !a
- [x] Bitwise: a|b, a&b, ab, ~a, a<>n
- [x] Pointer Arithmetic: p+n, p-n, p-q, p++, p--
- [x] Assignment:
=
- [x] Operator Assignment: a
<op>=
b - [x] BitField Assignment:
=
- [ ] BitField Operator Assignment: a
<op>=
b - [x] Struct/Union/BitField Member: a.b
- [x] Array Member: a[n]
- [x] Pointer Member: &a, *p, p[n], n[p], p->b
- [x] Comma:
a,b
- [x] Ternary Conditional: cond?a:b
- [x] Function Call: f(a1, a2, ...)
- [x] Conversion: (T)a
- [x] Sizeof: sizeof(T), sizeof(a)
- [x] Offsetof: __builtin_offsetof(T, member)
Literals
- [x] Boolean, Integer
- [x] Float, Complex Imaginary
- [x] Character, String
- [ ] Array:
(T[]){ expr1, expr2, ... }
- [ ] Array Pointer:
&(T[]){ expr1, expr2, ... }
- [ ] Struct:
struct T{ expr1, expr2, ... }
Initialization
- [x] Basic:
T a = expr
- [x] Array:
T a[] = { expr1, expr2, ... }
,T a[N] = { expr1, expr2, ... }
- [x] Struct:
struct T a = { expr1, expr2, ... }
,struct T a = { .a = expr1, .b = expr2, ... }
- [x] Union:
union T a = { expr }, union T a = { .a = expr }
- [x] Array in Struct:
struct { T a[N]; ... } v = { { expr1, expr2, ... }, ... }
,struct { T a[N]; ... } v = { { [0].a = expr1, [1].a = expr2, ... }, ... }
Control structures
- [x] If:
if (cond) stmt1 [else stmt2]
- [x] Switch:
switch (tag) { case expr1: stmt1 case expr2: stmt2 default: stmtN }
- [x] For:
for (init; cond; post) stmt
- [x] While:
while (cond) stmt
- [x] Do While:
do stmt while (cond)
- [x] Break/Continue:
break
,continue
- [x] Goto:
goto label
Functions
- [x] Parameters
- [x] Variadic Parameters
- [x] Variadic Parameter Access
- [x] Return