如何解决编译器警告“函数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
。
一个好办法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系统管理命令和 守护进程
也许可以解释为什么第3节和第2节? – 2010-01-27 12:16:23
'man memset'也会告诉你包含'string.h'。 – Noich 2013-07-14 13:24:16
+1给我们提供了一个通用的解决方案,而不仅仅是给出解决方案 – 2014-06-02 15:11:58
老问题,但我也有类似的问题,我加入
extern void* memset(void*, int, size_t);
或只是
extern void* memset();
在翻译单元的顶部(解决它* .c文件)。
否,你必须'#include
你*可以*自己合法地声明库函数(毕竟这是标准头文件的作用),但没有理由这么做。 – 2013-10-08 15:59:06
顺便说一句,memset,memcpy等并不总是库函数。它们可以是编译器的内置函数。例如,我的嵌入式系统的SDK中没有头文件“string.h”。因此,抑制警告是清理构建日志的唯一方法。 – 2014-06-04 13:01:19
尝试添加下一个定义你的.c文件的开头:
#define _GNU_SOURCE
它帮助我pipe2功能。
memset
要求您导入标头string.h
文件。因此,只需添加以下标题
#include <string.h>
...
是的,最初我刚刚看过标题和警告的第一部分。更新。 – 2010-01-27 04:44:36
+1,告诉提问者在哪里可以找到信息。 @OP:不要猜测,查看它! – 2010-01-27 05:05:15
包括也解决了我在Windows上使用GCC 4.8中的memcpy时出现的不兼容隐式声明警告的问题。 –
2013-08-28 17:08:07