Go Can';找不到struct';s一些带有pragma包的字段,64位整数

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的,如果我没有记错的话),但您的文本表明正

可以通过删除pragma包(1)进行编译


正在使用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)