如何解决编译器警告“函数memset的隐式声明”

如何解决编译器警告“函数memset的隐式声明”

问题描述:

我的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’ 

你能告诉我怎样才能解决这些警告?

谢谢。

您需要:

#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

一个好办法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

老问题,但我也有类似的问题,我加入

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

尝试添加下一个定义你的.c文件的开头:

#define _GNU_SOURCE 

它帮助我pipe2功能。

memset要求您导入标头string.h文件。因此,只需添加以下标题

#include <string.h> 
...