Golang 和 C 之间相互调用存在一些局限性。

首先不支持可变参数函数

我们知道 C 语言中 stdarg.h 这个头文件提供了可变参数的实现,但是 cgo 中暂未实现对这个特性的支持,这并不意味着 Golang 不支持可变参数,仅仅是 cgo 不支持而已。具体可以看这个 issue 和这个 commit

params

其次不支持带参数的宏定义

运行如下两段不同的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

/*
#define test 1
#define ABS(a) ((a) >= 0 ? (a) : (-(a)))
*/
import "C"

import "fmt"

func main() {
    fmt.Println(C.test)
    fmt.Println(C.ABS(-1))
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

/*
#define test 1
#define ABS(a) ((a) >= 0 ? (a) : (-(a)))
#define abs ABS(-1)
*/
import "C"

import "fmt"

func main() {
    fmt.Println(C.test)
    fmt.Println(C.abs)
}