¿Por qué no puedo leer una C constante de Golang correctamente?

Estoy usando go-hdf5 para leer un archivo hdf5 en golang. Estoy en windows7 usando una copia bastante reciente de mingw and hdf5 1.8.14_x86 y parece que intentar usar cualquiera de los tipos predefinidos no funciona, concentrémonos, por ejemplo, en T_NATIVE_UINT64. He reducido el problema a lo siguiente, que básicamente deja a go-hdf5 fuera del problema y apunta a que algo fundamental va mal:

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  void print_the_value2() { printf("the value of the constant is %d\n", H5T_NATIVE_UINT64); } */ import "C" func main() { C.print_the_value2() } 

Obviamente, necesitas tener hdf5 y apuntar el comstackdor a los encabezados / dlls y ejecutar go get, luego ejecutando imprime esto en mi PC

 the value of the constant is -1962924545 

Las variaciones de ejecución de lo anterior, en cómo / dónde se lee la constante, darán diferentes respuestas para el valor de H5T_NATIVE_UINT64. Sin embargo, estoy bastante seguro de que ninguno es el valor correcto y, de hecho, tratar de usar un tipo con el ID devuelto no funciona, como era de esperar.

Si escribo y ejecuto un progtwig C “real”, obtengo resultados diferentes

 #include  #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()); } 

Comstackndo utilizando

 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 

y correr me da

 the value of the constant is 50331683 

Y ese parece ser el valor correcto, ya que puedo usarlo directamente desde mi progtwig go. Obviamente quiero poder usar las constantes en su lugar. ¿Alguna idea de por qué esto podría estar pasando?

Información adicional después de los comentarios a continuación:

Busqué la definición de H5T_NATIVE_UINT64 en los encabezados de hdf5 y veo lo siguiente

 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; 

Todo el encabezado está aquí.

http://www.hdfgroup.org/ftp/HDF5/prev-releases/hdf5-1.8.14/src/unpacked/src/H5Tpublic.h

¡Gracias!

H5T_NATIVE_UINT64 NO es una constante sino una #define que finalmente evalúa a (H5Open(), H5T_NATIVE_UINT64_g) , que cgo no entiende.

Es fácil de verificar activando la salida de depuración en el preprocesador de gcc:

 gcc -E -dM your_test_c_file.c | grep H5T_NATIVE_UINT64 

Resultado:

 #define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) 

Ahora lo mismo para H5OPEN:

 gcc -E -dM test_go.c | grep '#define H5OPEN' 

da:

 #define H5OPEN H5open(), 

En este momento, cgo entiende la constante entera de enteros definida como #define VALUE 1234 , o cualquier cosa que el preprocesador gcc convierta en una constante entera. Consulte la función func (p *Package) guessKinds(f *File) en $GOROOT/src/cmd/cgo/gcc.go