Hay dos archivos fuente en mi programa.¿No debería coincidir la declaración con su definición cuando se trata de una matriz?
Una matriz se define en A.cpp.
// compiler: MSVC2005 SP2
// A.cpp
// defines an array of type "int [100]"
int a[100] = {3};
Se utiliza en B.cpp.
// B.cpp
// declares an array of type "int []"
extern int a[];
int main()
{
// prints 3 correctly
cout << a[0] << endl;
return 0;
}
yo sepa, enlazador generará un error si no se puede encontrar ninguna definición emparejados por una declaración si se utiliza el identificador declarado. Aquí, int [] y int [100] son dos tipos diferentes, obviamente.
¿Por qué, en este caso, no hay ningún error de enlace? ¿Está garantizado por el estándar que el tamaño de la matriz es trivial durante la coincidencia de declaración/definición? ¿O solo es específico de la implementación? Una cotización de la Norma será apreciada si alguna.
Editar: iammilind mencionado en su respuesta que enlazador puede funcionar correctamente (el compilador gcc es) incluso si el tipo no coincide entre la declaración y definición. ¿LO REQUIERE el estándar o solo una forma de gcc? Supongo que este es un problema mucho más importante que resolver.
El error está en "obviamente". –
@Alf. Nop. Cita del estándar 8.3.4 "El tipo " matriz de tipo lista de declaradores derivados de NT "es un tipo diferente del tipo" lista-tipo-lista-de-declaradores matriz de límite desconocido de T " –
@Erik : gracias por la cita. En lugar de entrar en una discusión sobre lo que "obviamente" conllevó, que por supuesto usted conoce mejor !, le sugiero que seleccione la respuesta de AndreyT como una solución, aunque en mi opinión su uso de la palabra "coincida" "es un poco engañoso.De todos modos, la razón por la que puede hacer que las cosas se vinculen donde los tipos no se ajustan a las reglas de lenguaje para la coincidencia, es que los compiladores no hacen un gran esfuerzo para detectar errores aquí. –