这个简单的.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/