这个简单的.c文件:

#include <unistd.h>

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

...正常编译后,效果很好:
$ cc  -Wall -c -o tmp.o tmp.c
$

...但是在C99模式下编译时会给出警告:
$ 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美观性的情况下克服这一问题吗?

对于其他标准库,我也遇到相同的问题。

最佳答案

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

man gethostname:



所以:

#define _BSD_SOURCE

#include <unistd.h>

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

血腥细节:

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

关于c - 在Linux上的unistd.h和c99,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3355298/

10-13 07:25