我正在使用 go-hdf5 將 hdf5 文件讀入 golang。我在 windows7 上使用了一個(gè)相當(dāng)新的 mingw 和 hdf5 1.8.14_x86 副本,似乎嘗試使用任何預(yù)定義類型都不起作用,讓我們關(guān)注 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 并運(yùn)行 go get,然后在我的電腦上執(zhí)行打印the value of the constant is -1962924545在讀取常量的方式/位置方面運(yùn)行上述變體,將對 H5T_NATIVE_UINT64 的值給出不同的答案。但是,我很確定沒有一個(gè)是正確的值,事實(shí)上,嘗試使用返回 id 的類型是行不通的,這并不奇怪。如果我編寫并運(yùn)行一個(gè)“真正的”C 程序,我會(huì)得到不同的結(jié)果#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這似乎是正確的值,因?yàn)槲铱梢灾苯訌奈业?go 程序中使用它。顯然我希望能夠使用常量。知道為什么會(huì)發(fā)生這種情況嗎?以下評論中的額外信息:我在 hdf5 標(biāo)頭中查找了 H5T_NATIVE_UINT64 的定義,并看到以下內(nèi)容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;整個(gè)標(biāo)題在這里http://www.hdfgroup.org/ftp/HDF5/prev-releases/hdf5-1.8.14/src/unpacked/src/H5Tpublic.h謝謝!
1 回答

慕絲7291255
TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
H5T_NATIVE_UINT64 不是一個(gè)常量,而是一個(gè)最終計(jì)算為 的#define (H5Open(), H5T_NATIVE_UINT64_g)
,cgo 不理解。
通過在 gcc 的預(yù)處理器上打開調(diào)試輸出很容易檢查:
gcc -E -dM your_test_c_file.c | grep H5T_NATIVE_UINT64
結(jié)果:
#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g)
現(xiàn)在 H5OPEN 也一樣:
gcc -E -dM test_go.c | grep '#define H5OPEN'
給出:
#define H5OPEN H5open(),
現(xiàn)在,cgo 確實(shí)理解簡單的整數(shù)常量定義,例如#define VALUE 1234
,或 gcc 預(yù)處理器將轉(zhuǎn)換為整數(shù)常量的任何內(nèi)容。見函數(shù)func (p *Package) guessKinds(f *File)
在$GOROOT/src/cmd/cgo/gcc.go
。
- 1 回答
- 0 關(guān)注
- 188 瀏覽
添加回答
舉報(bào)
0/150
提交
取消