advertencia: declaración implícita incompatible de la función incorporada ''xyz''
gcc gcc-warning (4)
Conocí estas advertencias en la función mempcpy
. La página Man dice que esta función es una extensión de GNU y la sinopsis muestra:
#define _GNU_SOURCE
#include <string.h>
Cuando #define
se agrega a mi fuente antes del #include
, las declaraciones para las extensiones de GNU se hacen visibles y las advertencias desaparecen.
Recibo algunas de estas advertencias cuando compilo algunos binarios:
warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strlen’
warning: incompatible implicit declaration of built-in function ‘exit’
Para tratar de resolver esto, he agregado
#include <stdlib.h>
en la parte superior de los archivos C asociados con esta advertencia, además de compilar con los siguientes indicadores:
CFLAGS = -fno-builtin-exit -fno-builtin-strcat -fno-builtin-strncat -fno-builtin-strcpy -fno-builtin-strlen -fno-builtin-calloc
Estoy usando GCC 4.1.2:
$ gcc --version
gcc (GCC) 4.1.2 20080704
¿Qué debo hacer para resolver estas advertencias?
En C, el uso de una función previamente no declarada constituye una declaración implícita de la función. En una declaración implícita, el tipo de devolución es int
si recuerdo correctamente. Ahora, GCC tiene definiciones incorporadas para algunas funciones estándar. Si una declaración implícita no coincide con la definición incorporada, recibe esta advertencia.
Para solucionar el problema, debe declarar las funciones antes de usarlas; normalmente haces esto al incluir el encabezado apropiado. Recomiendo no usar los -fno-builtin-*
si es posible.
En lugar de stdlib.h , debes probar:
#include <string.h>
Ahí es donde se definen strcpy
y strncpy
, al menos de acuerdo con la página del manual strcpy
(2).
La función de exit
se define en stdlib.h , sin embargo, así que no sé qué está sucediendo allí.
Aquí hay un código C que produce el error mencionado anteriormente:
int main(int argc, char **argv) {
exit(1);
}
Compilado así en Fedora 17 Linux 64 bit con gcc:
el@defiant ~/foo2 $ gcc -o n n2.c
n2.c: In function ‘main’:
n2.c:2:3: warning: incompatible implicit declaration of built-in
function ‘exit’ [enabled by default]
el@defiant ~/foo2 $ ./n
el@defiant ~/foo2 $
Para que la advertencia desaparezca, agregue esta declaración al principio del archivo:
#include <stdlib.h>
En el caso de algunos programas, estos errores son normales y no deberían ser corregidos.
Obtengo estos mensajes de error al compilar el programa phrap (por ejemplo). Este programa contiene código que modifica o reemplaza algunas funciones incorporadas, y cuando incluyo los archivos de encabezado apropiados para corregir las advertencias, GCC genera un montón de errores. Entonces, arreglar las advertencias rompe efectivamente la construcción.
Si obtuvo la fuente como parte de una distribución que debería compilarse normalmente, los errores podrían ser normales. Consulte la documentación para estar seguro.