es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

Tags:  , ,

Answer

  1. Avatar for 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 y linux para especificar los diferentes tipos requeridos para la estructura Params en cada plataforma.

    El código actualizado se vería así:

    package test
    
    /*
    #cgo CFLAGS: -g -Wall
    #cgo LDFLAGS: -L. -lmylib -lm -ldl
    #include "mylib.h"
    */
    import "C"
    
    type Params struct {
       k uint64_t
    }
    
    func NewParams(k uint64) Params {
      return Params{
    #ifdef __linux__
        k:     C.ulong(k),
    #elif __APPLE__
        k:     C.ulonglong(k),
    #endif
      }
    }
    

    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.

Comments are closed.