猿问

为什么我不能从 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 %d\n", H5T_NATIVE_UINT64); }

*/

import "C"


func main() {

    C.print_the_value2()

}

您显然需要有 hdf5 并将编译器指向头文件/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_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


谢谢!


富国沪深
浏览 175回答 1
1回答

慕丝7291255

H5T_NATIVE_UINT64 不是一个常量,而是一个最终计算为 的#define&nbsp;(H5Open(), H5T_NATIVE_UINT64_g),cgo 不理解。通过在 gcc 的预处理器上打开调试输出很容易检查:gcc&nbsp;-E&nbsp;-dM&nbsp;your_test_c_file.c&nbsp;|&nbsp;grep&nbsp;H5T_NATIVE_UINT64结果:#define&nbsp;H5T_NATIVE_UINT64&nbsp;(H5OPEN&nbsp;H5T_NATIVE_UINT64_g)现在 H5OPEN 也一样:gcc&nbsp;-E&nbsp;-dM&nbsp;test_go.c&nbsp;|&nbsp;grep&nbsp;'#define&nbsp;H5OPEN'给出:#define&nbsp;H5OPEN&nbsp;H5open(),现在,cgo 确实理解简单的整数常量定义,例如#define VALUE &nbsp;1234,或 gcc 预处理器将转换为整数常量的任何内容。见函数func (p *Package) guessKinds(f *File)在$GOROOT/src/cmd/cgo/gcc.go。
随时随地看视频慕课网APP

相关分类

Go
我要回答