¿Delaración externa para una matriz?

Tengo una matriz definida en un archivo y en otra tengo que usarla, por ejemplo,

/* ac - defines an array */ int a[] = {1,2,3,4,5,6,7,8,9}; /* bc - declare and use it. */ #define COUNT ((sizeof a)/(sizeof int)) extern int a[]; //size of array . . . int i; for(i=0; i<COUNT; i++) printf("%d", a[i]); . . . 

Ahora, cuando trato de comstackrlo, me dio un error diciendo que sizeof no se puede usar en un tipo incompleto.

¿Alguien puede decirme cómo manejar este caso en C / C ++? No quiero un subíndice de matriz en ac

Gracias por adelantado

Puede poner algo como lo siguiente en ac y luego salir de bc .

En ac:

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

Y luego en bc:

 extern int a[]; // the extern (thanks Tim Post) declaration means the actual storage is in another // module and fixed up at link time. The const (thanks Jens Gustedt) prevents it // from being modified at runtime (and thus rendering it incorrect). extern const int lengthofa; void somefunc() { int i; for ( i = 0; i < lengthofa; i++ ) printf( "%d\n", a[i] ); } 

Si desea que el tamaño de su matriz sea accesible como una constante de tiempo de comstackción, entonces no tiene otra opción que especificar el tamaño de la matriz explícitamente en la statement extern de la matriz.

 extern int a[9]; 

En este caso, es su responsabilidad asegurarse de que el tamaño de la matriz sea consistente entre la statement extern y la definición. Puede usar una constante de manifiesto para eso, pero será su responsabilidad asegurarse de que el número de inicializadores entre el {} y el tamaño declarado sea el mismo.

Si no te importa tener el tamaño del arreglo como una constante de tiempo de comstackción, entonces puedes hacer lo que Mark Wilkins sugiere en su respuesta.

Me gustaría #define ARRAY_MAX (or whatever) en un encabezado externo generalmente utilizado para definir tales cosas, y luego incluir ese encabezado en los dos archivos que lo necesitan. Esto funciona bien cuando tiende a mantener la mayoría, si no todas, sus define en uno o dos encabezados centrales.

El comstackdor no tiene suficiente información al comstackr bc para determinar el tamaño de la matriz. Esa información está solo en CA donde su lista de inicializadores está dentro del scope.

Tendrás que comunicar el tamaño de alguna manera. Un método es definir una constante constante con el tamaño y la externa también. Otra posibilidad sería usar un centinela (un valor fuera de su rango de datos válido) para indicar el final de la matriz.

en mi opinión, si no tiene definición y definición con tamaño de un archivo no comstack.

Los archivos se comstackn y almacenan como archivos * .obj / * .a. Puede utilizar matrices de otros archivos gracias a la statement externa que se verificará en el proceso de vinculación, después de la comstackción.

Desea declarar definir (el preprocesor debe ayudar aquí con esto. Se ejecuta antes que el comstackdor).

así que antes de la comstackción no obtendrás la matriz de otro archivo …