为什么我不能正确地从Golang读取C常量?
我使用go-hdf5将hdf5文件读入golang.我在
windows7上使用mingw和hdf5 1.8.14_x86的最新副本,似乎尝试使用任何预定义类型都不起作用,让我们关注例如T_NATIVE_UINT64.我把问题简化为以下内容,这基本上让go-hdf5摆脱了问题并指出了一些非常根本的错误:
package main /* #cgo CFLAGS: -IC:/HDF_Group/HDF5/1.8.14_x86/include #cgo LDFLAGS: -LC:/HDF_Group/HDF5/1.8.14_x86/bin -lhdf5 -lhdf5_hl #include "hdf5.h" #include <stdio.h> void print_the_value2() { printf("the value of the constant is %dn",H5T_NATIVE_UINT64); } */ import "C" func main() { C.print_the_value2() } 你显然需要有hdf5并将编译器指向headers / dll并运行go get,然后执行在我的电脑上打印 the value of the constant is -1962924545 运行上述变量,在读取常量的方式/位置,将为H5T_NATIVE_UINT64的值提供不同的答案.但是我很确定没有一个是正确的值,实际上尝试使用返回id的类型不起作用,这并不令人惊讶. 如果我编写并运行“真正的”C程序,我会得到不同的结果 #include <stdio.h> #include "hdf5.h" hid_t _go_hdf5_H5T_NATIVE_UINT64() { return H5T_NATIVE_UINT64; } int main() { printf("the value of the constant is %d",_go_hdf5_H5T_NATIVE_UINT64()); } 使用编译 C:Temp>gcc -IC:/HDF_Group/HDF5/1.8.14_x86/include -LC:/HDF_Group/HDF5/1.8.14_x86/bin -lhdf5 -lhdf5_hl -o stuff.exe stuff.c 跑步给了我 the value of the constant is 50331683 这似乎是正确的价值,因为我可以直接从我的go程序中使用它.显然我希望能够使用常量.知道为什么会发生这种情况吗? 以下评论后的额外信息: 我在hdf5标头中查找了H5T_NATIVE_UINT64的定义,并参见以下内容 c:HDF_GroupHDF51.8.14_x86include>grep H5T_NATIVE_UINT64 * H5Tpkg.h:H5_DLLVAR size_t H5T_NATIVE_UINT64_ALIGN_g; H5Tpublic.h:#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) H5Tpublic.h:H5_DLLVAR hid_t H5T_NATIVE_UINT64_g; 整个标题在这里 http://www.hdfgroup.org/ftp/HDF5/prev-releases/hdf5-1.8.14/src/unpacked/src/H5Tpublic.h 谢谢! 解决方法
H5T_NATIVE_UINT64不是常量,而是最终计算为(H5Open(),H5T_NATIVE_UINT64_g)的#define,cgo不理解.
通过在gcc的预处理器上打开调试输出来检查很容易: gcc -E -dM your_test_c_file.c | grep H5T_NATIVE_UINT64 结果: #define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) 对于H5OPEN现在也一样: gcc -E -dM test_go.c | grep '#define H5OPEN' 得到: #define H5OPEN H5open(), 现在,cgo确实理解简单的整数常量定义,如#define VALUE 1234,或者gcc预处理器将变成整数常量的任何东西.请参阅$GOROOT / src / cmd / cgo / gcc.go中的函数func(p * Package)guessKinds(f * File). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |