2010-01-27 4 views
25

내 C 코드는 'memset'과 'close'를 사용합니다. 는 내가 추가 한 :컴파일러 경고 '함수 memset의 암시 적 선언'을 해결하는 방법

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

하지만 여전히 이러한 경고를 얻을 :

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’ 

당신이 어떻게 이러한 경고를 해결할 수 있습니다 말해 주시겠습니까?

감사합니다.

답변

66

당신이 필요합니다

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

을 코드에서.

참조 : close의 경우 POSIX, memset의 경우 C 표준.

+0

그래, 처음에는 경고의 제목과 첫 부분을 보았습니다. 업데이트 됨. –

+1

질문자에게 정보를 찾는 위치를 알려주는 +1. @OP : 짐작하지 마세요. –

+0

을 포함 시키면 Windows에서 GCC 4.8의 memcpy에 관해서도 호환되지 않는 암시 적 선언 경고 문제가 해결되었습니다. –

28

좋은 방법 당신이 무엇을 놓치고 있는지 헤더 파일 findout합니다 :

man <section> <function call> 

이 섹션의 사용을 확인하려면 :

apropos <function call> 

예 님의 질문에 답변

man 3 memset 
man 2 send 

편집 제임스 모리스 :

  • 섹션 | 설명
  • 1 일반
  • 이 시스템은
  • 3 개 C 라이브러리 (은/dev에있는 보통 장치, 것) 기능
  • 4 개 특수 파일과 드라이버
  • 5 파일 형식과 규칙
  • 를 호출 명령 6 게임 및 스크린 세이버
  • 7 Miscellanea
  • 8 시스템 관리 명령 및 데몬

출처 : Wikipedia Man Page

+2

왜 3 절과 2 절을 왜 설명 할 수 있습니까? –

+0

'man memset'은'string.h'도 포함하도록 지시합니다. – Noich

+2

+1 솔루션을 제공하는 것보다 일반적인 해결책을 제공함으로써 가르침 +1 –

0

오래된 질문하지만 비슷한 문제를 가지고 내가 (번역 단위의 상단에

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

하거나

extern void* memset(); 

를 추가하여 해결 * .c 파일).

+0

아니요,'#include '은'memset (3)'을 선언해야합니다. – vonbrand

+0

당신은 합법적으로 라이브러리 함수를 직접 선언 할 수 있지만 (그렇게하는 것은 표준 헤더가하는 일입니다.), 그렇게 할 이유가 없습니다. –

+0

Btw, memset, memcpy 등은 항상 라이브러리 함수가 아닙니다. 컴파일러의 내장 함수가 될 수 있습니다. 예를 들어, 임베디드 시스템 용 SDK에는 헤더 "string.h"가 없습니다. 따라서 경고를 억제하는 것이 빌드 로그를 정리할 수있는 유일한 방법입니다. –

5

는 .c 파일의 시작 부분에 다음 추가 정의보십시오 :

#define _GNU_SOURCE 

그것은 pipe2 기능을 도와주었습니다.

13

memsetstring.h 헤더 파일을 가져와야합니다. 그럼 그냥 다음 헤더를 추가하십시오.

#include <string.h> 
...