我想访问Go中的C union领域。下面是我的源代码,但编译时出现错误:package main// #include <stdio.h>// #include <stdlib.h>// union bar {// char c;// int i;// double d;// };import "C"import "fmt"func main() { var b *C.union_bar = new(C.union_bar) b.c = 4 fmt.Println(b)}当我构建时,出现如下错误:bc未定义(类型* [8] byte没有字段或方法c)谁能告诉我访问联合字段的正确方法?
1 回答
天涯尽头无女友
TA贡献1831条经验 获得超9个赞
为了类型安全,似乎将联合视为[N] byte,N ==最大联合项目的大小。因此,在这种情况下,有必要将“可见”类型处理为[8] byte。然后它似乎起作用:
package main
/*
#include <stdio.h>
#include <stdlib.h>
union bar {
char c;
int i;
double d;
} bar;
void foo(union bar *b) {
printf("%i\n", b->i);
};
*/
import "C"
import "fmt"
func main() {
b := new(C.union_bar)
b[0] = 1
b[1] = 2
C.foo(b)
fmt.Println(b)
}
(11:28) jnml@celsius:~/src/tmp/union$ go build && ./union
513
&[1 2 0 0 0 0 0 0]
(11:28) jnml@celsius:~/src/tmp/union$
注意:相同的代码将在具有其他字节序的机器上打印不同的数字。
- 1 回答
- 0 关注
- 156 浏览
添加回答
举报
0/150
提交
取消