Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.4.3  Declaración implícita

§1  Nota histórica

Si no existe un prototipo previamente declarado de una función, el compilador C la supone declarada implícitamente la primera vez que aparece en una expresión. Por ejemplo, si el compilador encuentra una sentencia como:

sum += convert(line);

sin que hubiese un prototipo previo de convert, asume que se trata de una función, la declara; supone que devuelve un entero, y no realiza ninguna suposición sobre el parámetro line. El compilador puede avisar: Call to function 'convert' with no prototype in .... Si más adelante se encontrase una definición de convert del tipo:

void convert(const char * string);

El compilador sí enviaría un mensaje de error: Type mismatch in redeclaration of 'convert'. La razón es que como hemos dicho, en la primera línea declaró convert como devolviendo un int, y ahora se encuentra una función del mismo nombre, pero devolviendo void, con lo que supone que es una redefinición de la función.

La razón de esta permisividad (no exigir una declaración formal), es para que los programas antiguos puedan ser recompilados con los nuevos compiladores sin necesidad de rescribir el código. La suposición de que se trata de una función, ocurre cada vez que el compilador encuentra un identificador desconocido seguido de un paréntesis izquierdo.

§2  En C++

Por su parte C++ es más estricto al respecto, se exige una declaración (prototipo) de todas las funciones antes de usarlas (lo cual redunda en la seguridad), por lo que un caso como el anterior siempre daría un error al intentar compilar la primera línea: Call to undefined function 'convert' in ....

Como puede verse, en este como en otros casos, la evolución de C++ respecto de C ha seguido el camino de la seguridad. Sería además la razón por la que algún programa C no podría ser compilado directamente como C++ sin algún retoque.