2010-01-27 20 views
25

Mi código c usa 'memset' y 'close'. y he añadido:Cómo resolver la advertencia del compilador 'declaración implícita de la función memset'

#include <stdio.h> 
#include <glib.h> 
#include <stdlib.h> 

Pero sigo teniendo estas advertencias:

main.c:259: warning: implicit declaration of function ‘memset’ 
main.c:259: warning: incompatible implicit declaration of built-in function ‘memset’ 
main.c:268: warning: implicit declaration of function ‘close’ 
main.c:259: warning: incompatible implicit declaration of built-in function ‘close’ 

¿Puede usted por favor dígame cómo puedo resolver estas advertencias?

Gracias.

Respuesta

66

que necesita:

#include <string.h> /* memset */ 
#include <unistd.h> /* close */ 

en el código.

Referencias: POSIX para close, el estándar C para memset.

+0

Sí, inicialmente había visto el título y la primera parte de las advertencias. Actualizado. –

+1

+1 para indicar al consultante dónde encontrar la información. @OP: ¡No adivinen, búsquenlo! –

+0

Incluyendo también resolvió mi problema de advertencia de declaración implícita incompatible cuando se trata de memcpy en GCC 4.8 en Windows. –

28

Una buena manera de findout lo archivo de cabecera se echa en falta:

man <section> <function call> 

Para saber en la sección de uso:

apropos <function call> 

Ejemplo:

man 3 memset 
man 2 send 

Editar en respuesta a James Morris:

  • Sección | Comandos Descripción
  • 1 General
  • 2 Llamadas al sistema
  • 3 funciones de biblioteca C
  • 4 archivos especiales (generalmente dispositivos, aquellos que se encuentran en/dev) y los conductores
  • 5 formatos de archivo y convenciones
  • 6 Juegos y protectores de pantalla
  • 7 Miscellanea
  • 8 Comandos de administración del sistema y daemons

Fuente: Wikipedia Man Page

+2

Quizás explique por qué la sección 3 y la sección 2? –

+0

'man memset' también le dirá que incluya' string.h'. – Noich

+2

+1 para la enseñanza dándonos una solución general en lugar de solo dar la solución –

0

vieja pregunta, pero he tenido problema similar y lo solucioné añadiendo

extern void* memset(void*, int, size_t); 

o simplemente

extern void* memset(); 

en la parte superior de la unidad de traducción (* archivo .c).

+0

No, tienes que '#include ' declarar 'memset (3)'. – vonbrand

+0

Usted * puede * declarar legalmente las funciones de la biblioteca usted mismo (eso es lo que hacen los encabezados estándar, después de todo) pero no hay una buena razón para hacerlo. –

+0

Btw, memset, memcpy, etc. no son siempre funciones de biblioteca. Pueden ser funciones integradas del compilador. Por ejemplo, no tengo un encabezado "string.h" en SDK para mi sistema integrado. Por lo tanto, suprimir la advertencia es la única manera de limpiar el registro de compilación. –

5

intenta agregar próxima definir al comienzo de su archivo .c:

#define _GNU_SOURCE 

Me ayudó con la función pipe2.

13

memset requiere que importe el archivo de encabezado string.h. Así que solo agregue el siguiente encabezado

#include <string.h> 
... 
Cuestiones relacionadas