我正在使用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 %d\n", H5T_NATIVE_UINT64); }
*/
import "C"
func main() {
C.print_the_value2()
}
您显然需要安装hdf5,并将编译器指向 header /dll,然后运行go get,然后执行在我的PC上打印此文件
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 header 中寻找了H5T_NATIVE_UINT64的定义,请参见以下内容
c:\HDF_Group\HDF5\1.8.14_x86\include>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不是常数,而是#define,最终评估为(H5Open(), H5T_NATIVE_UINT64_g)
,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预处理器将变成整数常量的任何内容。请参见func (p *Package) guessKinds(f *File)
中的函数$GOROOT/src/cmd/cgo/gcc.go
。关于c - 为什么我不能从Golang中正确读取C常量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28442524/