Declaraciones de funciones implícitas en C
¿Qué se entiende por el término "declaración implícita de una función"? Una llamada a una función de biblioteca estándar sin incluir el archivo de encabezado apropiado produce una advertencia como en el caso de:
int main(){
printf("How is this not an error?");
return 0;
}
¿No debería ser un error usar una función sin declararla? Por favor explique en detalle. Busqué en este sitio y encontré preguntas similares, pero no pude encontrar una respuesta definitiva. La mayoría de las respuestas decían algo acerca de incluir el archivo de encabezado para eliminar la advertencia, pero quiero saber cómo esto no es un error.
Debe considerarse un error. Pero C es un lenguaje antiguo, por lo que es sólo una advertencia.
La compilación con -Werror (GCC) soluciona este problema.
Cuando C no encuentra una declaración, asume esta declaración implícita: int f();
, lo que significa que la función puede recibir cualquier cosa que le des y devuelve un número entero. Si esto está lo suficientemente cerca (y en el caso de printf
, lo es), entonces las cosas pueden funcionar. En algunos casos (por ejemplo, la función en realidad devuelve un puntero y los punteros son más grandes que los enteros), puede causar problemas reales.
Tenga en cuenta que esto se solucionó en los estándares C más nuevos ( C99 y C11 ). En estos estándares, esto es un error. Sin embargo, GCC no implementa estos estándares de forma predeterminada, por lo que aún recibirá la advertencia.
Las declaraciones implícitas no son válidas en C.
C99 eliminó esta característica (presente en C89 ).
GCC elige emitir solo una advertencia de forma predeterminada con -std=c99 , pero un compilador tiene derecho a negarse a traducir dicho programa.