2010-12-07 8 views
5

Teniendo en cuenta el VLA (matriz de longitud variable) Me gustaría pedir a sus comentarios sobre el siguiente problema: Si un conjunto se define en el ámbito mundial en un solo archivo:¿Cómo declarar una matriz global de tamaño definida en otro archivo en C99?

int arr[] = {1, 2, 3}; 

// in the same file it is no problem to obtain the number of elements in arr by 
#define arr_num sizeof(arr)/sizeof(arr[0]) 
// or 
enum {arr_num = sizeof(arr)/sizeof(arr[0])}; 

El problema es que en otros archivos en el mismo proyecto, me gustaría crear otras matrices de nuevo en ámbito global con la misma cantidad de elementos que existen en arr. Pero, ¿cómo se puede lograr esto en C99 si no hay forma de "externar" la enumeración o el #define? Por supuesto, uno puede # definir el número de elementos de arr a mano en un archivo de cabecera y luego usarlo en los otros archivos, pero esto es muy inconveniente ya que al cambiar el número de elementos en la matriz arr uno también tiene que cambiar a mano el valor de este #define (esto es aún más inconveniente cuando arr es una matriz de estructuras).

Muchas gracias por cualquier ayuda.

Respuesta

0

AFAIK no puede hacer esto de acuerdo con C99. Porque todos los módulos de traducción se compilan de forma independiente, mientras que sizeof se debe conocer en tiempo de compilación.

Usted puede hacer algo como esto:

int arr[] = {1, 2, 3}; 
const int g_arrCount = sizeof(arr)/sizeof(arr[0]); 

// other translation unit 
extern const int g_arrCount; 

Si utiliza toda una opción de optimización del programa - más probable es que la variable g_arrCount se omite por completo, y en su lugar se utilizará su valor directo.

+0

Todavía no es válido C incluso con la optimización de todo el programa. –

2

Los VLA no ayudan con eso: tienen que ser variables automáticas, y por lo tanto no se puede convertir una variable global en un VLA. Estoy de acuerdo con Valdo en que tener una variable global que contenga el tamaño de la matriz (o, alternativamente, una función que la devuelva) es el enfoque correcto.

+0

Muchas gracias por sus respuestas. – davhak

+0

De sus sugerencias entendí que la ayuda de usar una variable const global o una función depende de si el compilador hará la optimización de reemplazar una variable o un valor de retorno con una constante entera o no y tales indicadores de compilación pueden no existir en absoluto . ¿Podría indicar también qué tipo de banderas de compilación podría usar? (Trabajo con el compilador de CodeSourcery arm-none-eabi-gcc). Muchas gracias por adelantado. – davhak

+0

Una variable global 'const' es solo eso, una * variable *. Esto no es C++. Las variables 'const' no son válidas en expresiones constantes. –

Cuestiones relacionadas