Go Can';找不到struct';s一些带有pragma包的字段,64位整数
可以通过删除pragma包(1)进行编译Go Can';找不到struct';s一些带有pragma包的字段,64位整数,go,enums,cgo,Go,Enums,Cgo,可以通过删除pragma包(1)进行编译 正在使用Go 1.15版本。你知道为什么吗?我找到了我问题的答案 如果C结构的字段对齐,以致于它们不能由Go结构表示,则不能直接从cgo访问它们。您必须用C编写函数才能读写这些字段。 我现在太忙了,无法发表评论。时间不早了,但已经有人回答了。请你1)重新格式化问题的结尾部分,使其可读;2) 澄清“pragma包(1)”到底会发生什么?让我澄清第二点:您的示例使用了\uuuu属性(packed))(这是特定于GCC的,如果我没有记错的话),但您的文本表明正
正在使用Go 1.15版本。你知道为什么吗?我找到了我问题的答案
如果C结构的字段对齐,以致于它们不能由Go结构表示,则不能直接从cgo访问它们。您必须用C编写函数才能读写这些字段。
我现在太忙了,无法发表评论。时间不早了,但已经有人回答了。请你1)重新格式化问题的结尾部分,使其可读;2) 澄清“pragma包(1)”到底会发生什么?让我澄清第二点:您的示例使用了
\uuuu属性(packed))
(这是特定于GCC的,如果我没有记错的话),但您的文本表明正在讨论\pragma pack(1)
的用法,这在示例中是缺失的,是另一个野兽。因此,正如前面所述,这个问题很难理解。@kostix在编辑过程中,\uuuuu属性
输入错误。包装(1)正确无误。我的帖子已被编辑。对我来说似乎是个bug:尝试以下操作之一:1)运行go build-x-work
,注意为保存中间文件而创建的目录的名称-work
使go build
不会删除它,因此您可以到那里检查生成的文件\u cgo\u gotypes.go
.2)运行go tool cgo yourfile.go
在\u obj
子目录(将创建)中获取相同的文件集。无论哪种方式,您都会在wow
和some5
字段之间看到一个[24]字节的字段(gc
Go 1.15.3,Linux/amd64上)。如果您要报告,请在这里发布链接,谢谢。_cgo_gotypes.go:type\u Ctype\u struct\u sss struct{some\u Ctype\u uint64\u t wow\u Ctype\u uint32\u t[24]byte some5\u Ctype\u uint32\u t}
一些变量被隐藏。是go 1.15错误吗?对不起,你的评论和我之前评论的最后两句有什么不同?
package main
/*
#include <inttypes.h>
#pragma pack(1)
typedef struct _sss {
uint64_t some; // ok
uint32_t wow; // ok
uint64_t some2; // not found
uint64_t some3; // not found
uint64_t some4; // not found
uint32_t some5; // ok
} Type;
#pragma pack()
*/
import "C"
import (
"fmt"
)
func main() {
s := C.Type{}
s.some = 10;
s.wow = 10;
s.some2 = 10;
s.some5 = 10;
fmt.Println("Hello, playground")
}
╭─dire@dire-81w4 ~/workspace
╰─go run test.go 2 ↵
# command-line-arguments
./test.go:25:6: s.some2 undefined (type _Ctype_struct__sss has no field or method some2)