2012-02-23 10 views
5

El test.c siguiente programa¿Por qué GCC es inconsistente sobre emitir advertencias para funciones no declaradas?

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

int dummySum(int a, int b) { 
    return a + b; 
} 

... no genera ningún tipo de advertencia cuando se compila con gcc -o test test.c, mientras que la siguiente se hace:

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

void dummySum(int a, int b) { 
    a + b; 
} 

¿Por qué?

+0

No lo es. Yo también pensé eso. 'int' vs' void' return type de 'dummySum'. – mattjgalloway

+1

El tipo de devolución predeterminado de una función no declarada es int. Cuando lo declaras como nulo, no encuentra ninguna función coincidente. Creo que si usa una prueba de advertencia más fuerte (por ejemplo, "Pared"), recibirá una advertencia en ambos casos. – Joe

+1

en la primera publicación era la misma, tienes razón. Edité la publicación. Lo siento –

Respuesta

8

Cuando nos enfrentamos a una función no declarada, el compilador asume una función que acepta el número dado de argumentos (creo) y devuelve int(la parte que estoy seguro). El segundo no, y entonces obtienes la advertencia de redefinición.

Creo que, basado en un escaneo muy rápido del anterior, que C99 (PDF link) eliminó esto. No es de extrañar que GCC todavía les permita (con una advertencia); No puedo imaginar la cantidad de código que comienzan a fallar para compilar ...


recomienda utilizar -Wall (encender todas las advertencias) para que pueda obtener una gran cantidad de información adicional (se puede desactivar advertencias específicas cuando se tiene un muy buen motivo para lo que sea que esté haciendo que los genera si es necesario).

+0

La 'implícita int' se eliminó en C99, por lo que en el modo estricto C99 o modo C11, no debería compilarse, IMO. Sin embargo, gcc lo compila y simplemente escupe una advertencia (para ambos). –

+0

@DanielFischer: ¡Interesante! En realidad, solo miré C99 y creo que va más allá: elimina por completo las declaraciones de funciones implícitas. (Curiosamente, el prólogo enumera los dos elementos por separado, "eliminó implícito' int' "y" eliminó las declaraciones de funciones implícitas "). Sospecho que el bit "implicit' int' "se refiere a una función que está declarada, pero sin ningún tipo de devolución en absoluto. –

+0

Probablemente, al no ser un abogado de idiomas, tiendo a usar 'implicit int' para todas las situaciones en las que se asume un tipo porque no está declarado. –

2

No se puede utilizar una función antes de que se haya declarado. Cuando una declaración de la función no es visible, la aplicación asume en C89 que la función:

  • toma un número no especificado (pero fijo) de los parámetros

  • devuelve un int

Este se llama una declaración de función implícita .

En C99, las declaraciones implícitas de función se han eliminado del lenguaje y la implementación es libre de negarse a traducir el código fuente.

Cuestiones relacionadas