¿Por qué gcc permite que se pasen argumentos a una función definida sin argumentos?

 C Programming >> Programación C >  >> Tags >> GCC
¿Por qué gcc permite que se pasen argumentos a una función definida sin argumentos?


No entiendo por qué se compila este código?


#include <stdio.h>
void foo() {
printf("Hello\n");
}
int main() {
const char *str = "bar";
foo(str);
return 0;
}

gcc ni siquiera lanza una advertencia de que estoy pasando demasiados argumentos a foo(). ¿Es este el comportamiento esperado?


Respuestas:


En C, una función declarada con una lista de parámetros vacía acepta un número arbitrario de argumentos cuando se llama, que están sujetos a las promociones aritméticas habituales. Es responsabilidad de la persona que llama asegurarse de que los argumentos proporcionados sean apropiados para la definición de la función.


Para declarar una función que toma cero argumentos, debe escribir void foo(void); .


Esto es por razones históricas; originalmente, las funciones de C no tenían prototipos, ya que C evolucionó de B, un lenguaje sin tipos. Cuando se agregaron los prototipos, las declaraciones sin tipos originales se dejaron en el lenguaje para compatibilidad con versiones anteriores.


Para que gcc advierta sobre listas de parámetros vacías, use -Wstrict-prototypes :