CGO中的一些使用注意事项

CGO中的一些使用注意事项

1. CGO中的内容必须紧挨着import "C", 中间不得有其他import

  • 错误示范
1
2
3
4
5
6
7
8
9
package main

// #include <stdio.h>
import "fmt"
import "C"

func main() {
fmt.Println(C.puts(C.CString("这是一个golang字符串")))
}
  • 应该改为
1
2
3
4
5
6
7
8
9
package main

// #include <stdio.h>
import "C"
import "fmt"

func main() {
fmt.Println(C.puts(C.CString("这是一个golang字符串")))
}

2. import “C”前面的注释与import “C”之间不得有空行

  • 错误示范
1
2
3
4
5
6
7
8
9
10
package main

// #include <stdio.h>

import "C"
import "fmt"

func main() {
fmt.Println(C.puts(C.CString("这是一个golang字符串")))
}
  • 正确应为
1
2
3
4
5
6
7
8
9
package main

// #include <stdio.h>
import "C"
import "fmt"

func main() {
fmt.Println(C.puts(C.CString("这是一个golang字符串")))
}

3. go中无法直接使用C语言头文件中的 enum,structunion, 需要使用时,需要对相关的类型进行 typedef重定义

  • 错误示范
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

/*
enum CEnum {
zero,
one,
two,
three
};
struct CStruct {
int number;
};
*/
import "C"

func main() {
var cenum C.CEnum = C.zero
var cstruct C.CStruct
fmt.Println(cenum, cstruct.number)
}
  • 正确应为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
/*
typedef enum CEnum {
zero,
one,
two,
three
} CEnum;
typedef struct CStruct {
int number;
} CStruct;
*/
import "C"

func main() {
var cenum C.CEnum = C.zero
var cstruct C.CStruct
fmt.Println(cenum, cstruct.number)
}

4. C中的union在CGO里面表现为[N]byte类型(其中N为该union类型占用的最大字节数)

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

/*
typedef union Val {
int i;
float f;
double d;
} Val;
*/
import "C"

func main() {
var value = C.Val {100}
println(len(value), value[0]) // 8 100
}
感谢您对本站的支持.