¿Cómo convertir consistentemente C uint64_t a Cgo en diferentes sistemas operativos?
Estoy utilizando una biblioteca de C desde Go, utilizando cgo para manejar la conversión.
Tengo un archivo de encabezado de C que se ve así:
#include <stdlib.h>
typedef struct {
k uint64_t;
} params;
Esta estructura se utiliza desde Go con código como este:
package test
/*
#cgo CFLAGS: -g -Wall
#cgo LDFLAGS: -L. -lmylib -lm -ldl
#include "mylib.h"
*/
import "C"
func NewParams(k uint64) Params {
return Params{
k: C.ulonglong(k),
}
}
El código se compila correctamente en OS X con Apple clang versión 12.0.0, pero falla en Linux con la versión de clang 7.1.0, arrojando el siguiente error:
cannot use _Ctype_ulonglong(k) (type _Ctype_ulonglong) as type _Ctype_ulong in field value
Si cambio la llamada a C.ulonglong
por C.ulong
, funciona bien en Linux pero luego falla en OS X.
¿Cómo puedo asegurarme de que el mismo código funcione en ambas plataformas?</stdlib.h>
davy.ai
Para asegurarnos de que el mismo código funcione en ambas plataformas, podemos utilizar la compilación condicional mediante etiquetas de construcción. Las etiquetas de construcción nos permiten especificar diferentes restricciones de compilación para diferentes plataformas. En este caso, podemos utilizar las etiquetas de construcción
darwin
ylinux
para especificar los diferentes tipos requeridos para la estructuraParams
en cada plataforma.El código actualizado se vería así:
Con este código actualizado, se utilizará el tipo de estructura
Params
correcto dependiendo de la plataforma en la que se compile. Esto debería asegurar que el código se compile y funcione correctamente tanto en OS X como en Linux.