2010-01-27 37 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 */ 

在你的代碼。

參考文獻:POSIX爲close,C標準爲memset

+0

是的,最初我剛剛看過標題和警告的第一部分。更新。 – 2010-01-27 04:44:36

+1

+1,告訴提問者在哪裏可以找到信息。 @OP:不要猜測,查看它! – 2010-01-27 05:05:15

+0

包括也解決了我在Windows上使用GCC 4.8中的memcpy時出現的不兼容隱式聲明警告的問題。 – 2013-08-28 17:08:07

28

一個好辦法findout你錯過了什麼頭文件:

man <section> <function call> 

要找出部分使用:

apropos <function call> 

例:響應

man 3 memset 
man 2 send 

編輯詹姆斯莫里斯:

  • 部分|描述
  • 1一般命令
  • 2系統調用
  • 3個C庫函數
  • 4個特殊文件(通常設備, 那些/ dev中找到)和驅動程序
  • 5文件格式和約定
  • 6遊戲和屏保
  • 7 Miscellanea
  • 8系統管理命令和 守護進程

來源:Wikipedia Man Page

+2

也許可以解釋爲什麼第3節和第2節? – 2010-01-27 12:16:23

+0

'man memset'也會告訴你包含'string.h'。 – Noich 2013-07-14 13:24:16

+2

+1給我們提供了一個通用的解決方案,而不僅僅是給出解決方案 – 2014-06-02 15:11:58

0

老問題,但我也有類似的問題,我加入

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

或只是

extern void* memset(); 

在翻譯單元的頂部(解決它* .c文件)。

+0

否,你必須'#include '來聲明'memset(3)'。 – vonbrand 2013-02-24 18:43:51

+0

你*可以*自己合法地聲明庫函數(畢竟這是標準頭文件的作用),但沒有理由這麼做。 – 2013-10-08 15:59:06

+0

順便說一句,memset,memcpy等並不總是庫函數。它們可以是編譯器的內置函數。例如,我的嵌入式系統的SDK中沒有頭文件「string.h」。因此,抑制警告是清理構建日誌的唯一方法。 – 2014-06-04 13:01:19

5

嘗試添加下一個定義你的.c文件的開頭:

#define _GNU_SOURCE 

它幫助我pipe2功能。

13

memset要求您導入標頭string.h文件。因此,只需添加以下標題

#include <string.h> 
... 
相關問題