首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux上的unistd.h和c99

Linux上的unistd.h和c99
EN

Stack Overflow用户
提问于 2010-07-29 00:51:26
回答 3查看 8.7K关注 0票数 13

这个简单的.c文件:

代码语言:javascript
复制
#include <unistd.h>

void test() {
   char string[40];
   gethostname(string,40);
}

..。正常编译时,工作正常:

代码语言:javascript
复制
$ cc  -Wall -c -o tmp.o tmp.c
$

..。但在C99模式下编译时,会给出一个警告:

代码语言:javascript
复制
$ cc -Wall -std=c99 -c -o tmp.o tmp.c 
tmp.c: In function `test':
tmp.c:5: warning: implicit declaration of function `gethostname'
$

生成的.o文件没有问题,并且链接可以正常工作。我只想摆脱这个警告。通过将声明放入我自己的.h文件中,我可以用一种简单的方法来实现这一点。

是什么关于C99意味着unistd.h中的声明没有包括在内?能否在不放弃C99的优点的情况下克服这一点?

我在其他标准库中看到了同样的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-29 01:13:00

您可能需要以特定的方式定义一些宏,以获得gethostname()的原型

来自man gethostname

glibc的

功能测试宏要求(参见feature_test_macros(7)):

gethostname():_BSD_SOURCE || _XOPEN_SOURCE >= 500 sethostname():_BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

所以:

代码语言:javascript
复制
#define _BSD_SOURCE

#include <unistd.h>

void test() {
   char string[40];
   gethostname(string,40);
}

血淋淋的细节:

如果不指定-std-c99选项,那么features.h (由unistd.h隐式包含)将默认以包含gethostname()原型的方式设置_BSD_SOURCE。但是,指定-std=c99会导致编译器自动定义__STRICT_ANSI__,这又会导致features.h不定义_BSD_SOURCE,除非您使用自己的特征宏定义强制它(如上所述)。

票数 20
EN

Stack Overflow用户

发布于 2010-07-29 00:58:00

gethostname( )不是一个标准的C函数(在C99标准中没有提到它),所以在编译到标准时没有正确地定义符号。

如果您使用的是gcc工具链,那么使用-std=gnu99就可以获得您想要的行为。

或者,看一下<features.h>,您似乎可以使用-D_GNU_SOURCE-D_XOPEN_SOURCE=500来获得所需的行为。

票数 11
EN

Stack Overflow用户

发布于 2010-07-29 01:29:05

阅读man gethostname。它在功能测试宏要求中说,需要_BSD_SOURCE (或_XOPEN_SOURCE>500)从unistd.h中拉出gethostname。

接下来,请阅读man feature_test_macros。你会发现-std=c99打开了__STRICT_ANSI__,从而关闭了_BSD_SOURCE。这意味着您不能从unistd.h获取gethostname,除非您重新定义_BSD_SOURCE。我通常将_GNU_SOURCE放在我的命令行(即gcc -D_GNU_SOURCE -std=c99 file.c)中,这也会打开_BSD_SOURCE

附注:手册页包含一个可以打印当前ft宏的示例程序。对于某些编译器设置,您可能会编译并运行它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3355298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档