C 函数拭子的隐式声明

C 函数拭子的隐式声明,c,gcc,warnings,unistd.h,C,Gcc,Warnings,Unistd.h,编辑:第一段中的警告是因为我从编译器中读取了旧日志(在包括unistd.h之前,很抱歉出现了错误,第二个问题仍然存在) 我有一个使用c函数unlink(在unistd.h中声明)的代码。在使用gcc-Wall编译时,我得到了警告:函数“unlink”的隐式声明现在我知道这只是一个警告,但它有点让我恼火,我想知道解决这个问题的正确方法。我当前的解决方案是简单地添加行extern int unlink(const char*path)到代码,但这似乎有点愚蠢,因为我还包括unistd.h 我曾经收到

编辑:第一段中的警告是因为我从编译器中读取了旧日志(在包括unistd.h之前,很抱歉出现了错误,第二个问题仍然存在) 我有一个使用c函数unlink(在unistd.h中声明)的代码。在使用gcc-Wall编译时,我得到了警告:
函数“unlink”的隐式声明
现在我知道这只是一个警告,但它有点让我恼火,我想知道解决这个问题的正确方法。我当前的解决方案是简单地添加行
extern int unlink(const char*path)到代码,但这似乎有点愚蠢,因为我还包括unistd.h

我曾经收到关于使用函数swab(也在unistd.h中声明)的警告,但是在检查了unistd.h之后,我设法通过添加行来解决这个问题

#ifndef __USE_XOPEN
#define __USE_XOPEN 
#endif

不确定这样做是否合适,对此的任何见解也将不胜感激。

参考您的第二期(“隐式函数声明
sawb
”):

替换

#ifndef __USE_XOPEN
#define __USE_XOPEN 
#endif

。。。将其放在所有其他
#include
语句
#include
之前,应该可以使用
棉签()的原型



#define
以双下划线开头的
\uuu
保留供内部使用,不能由程序直接设置。

您很可能有打字错误或简单的错误……试试这个

#include <unistd.h>

int
main()
{
    int r;  

    r = unlink("foo");

    return(r);
}
上面应该是一个干净的编译。您可以预处理并执行grep以验证是否拉入了unlink声明

sys> gcc -E foo.c | grep unlink
int unlink(const char *);
 r = unlink("foo");

嗯,不好,那只是给了我一个关于暗含棉签声明的警告back@cpaitor:您使用的是哪个gcc版本和平台?另外,请参阅我的更新答案。gcc 4.6.2,OpenUse 12.1,我认为
\uuu\uu
不能使用,哦,我也更新了我的问题,因为取消链接的警告并不存在,对不起that@cpaitor:(和alk)您应该将特性测试宏定义(
#define#XOPEN(u SOURCE
)放在任何包含之前,不仅仅是在
之前#包括
。否则,某些其他标题可能包括定义
swab
的内部标题,并且它将不会再次包含在新的功能测试设置中。@cpaitor:对于swab,否。对于其他接口,可能;函数调用的
man
页面应该会告诉您。(
500
启用Unix98,
600
启用Posix2001,
700
启用Posix2008,假设您的标准库实现了这些接口。)如果您必须创建ifdef以使用unlink,那么您的系统中会出现一些非常严重的问题。是的,您可能是对的,这篇文章是更新的HMMMM,编译起来很有魅力。你可能是对的,代码中有一些问题,我不是自己写的,但我一直在努力清理混乱
gcc -Wall foo.c
sys> gcc -E foo.c | grep unlink
int unlink(const char *);
 r = unlink("foo");