Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

190
Vistas
¿Se puede exponer una constante/estática de Rust a C?

Digamos que tengo una API de Rust que contiene una constante o estática, por ejemplo, un i32. Quiero usar esta API de Rust de C. Desde el lado de C, quiero usar esa constante como tamaño de matriz. ¿Estoy en lo cierto en que no hay forma de hacerlo? ¿La mejor solución es volver a declarar la constante en mis archivos de encabezado C que proporcionan las declaraciones para el resto de la API de Rust?

Actualización: para ser más específicos, estoy usando un compilador que no admite matrices de longitud variable (Visual C++ 2005)

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Ciertamente puedes hacerlo, al menos dentro de las funciones:

cnst.rs :

 #[no_mangle] pub static X: i32 = 42;

cnstuse.c :

 #include <stdint.h> #include <stdio.h> extern const int32_t X; int main() { char data[X]; printf("%lu\n", sizeof(data)); return 0; }

Compilacion:

 % rustc --crate-type=staticlib cnst.rs note: link against the following native artifacts when linking against this static library note: the order and any duplication can be significant on some platforms, and so may need to be preserved note: library: System note: library: pthread note: library: c note: library: m % gcc -o cnstuse cnstuse.c libcnst.a % ./cnstuse 42

Sin embargo, las declaraciones de matriz de nivel superior no pueden usar variables/constantes globales para el tamaño, por lo que esto solo funcionará dentro de las funciones.

over 4 years ago · Santiago Trujillo Denunciar

0

Para ser más específico, estoy usando un compilador que no admite matrices de longitud variable (Visual C++ 2005)

Esto requiere que la constante se defina (y no simplemente se declare) en el punto de uso. Además, C tiene muchas más restricciones que C++ sobre lo que constituye una constante utilizable como una dimensión de matriz: básicamente, literales enteros (que se pueden sustituir a través de macros) y enumeradores; a diferencia de C++, no tiene constantes integrales ( int const x ), por lo que, según el modo (C o C++) en el que compile, es posible que esté restringido.

No hay ninguna función en rustc o Cargo para generar automáticamente archivos C, los símbolos solo se exportan y están disponibles en tiempo de enlace, no en tiempo de compilación.


Sin embargo, tiene suerte, hay una solución, aunque es un poco más engorrosa.

Rust presenta un archivo build.rs , que se compila y ejecuta como parte del proceso de compilación normal. Este archivo puede contener comandos para generar otros archivos, y por lo tanto es perfectamente posible:

  1. Anote la constante de una vez por todas en un archivo .rs
  2. Genere un encabezado C "exportando" esta constante en formato C a través del archivo build.rs .
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda