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)
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 42Sin 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.
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:
.rsbuild.rs .