这个简单的.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的优点的情况下克服这一点?
我在其他标准库中看到了同样的问题。
发布于 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)
所以:
#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,除非您使用自己的特征宏定义强制它(如上所述)。
发布于 2010-07-29 00:58:00
gethostname( )不是一个标准的C函数(在C99标准中没有提到它),所以在编译到标准时没有正确地定义符号。
如果您使用的是gcc工具链,那么使用-std=gnu99就可以获得您想要的行为。
或者,看一下<features.h>,您似乎可以使用-D_GNU_SOURCE或-D_XOPEN_SOURCE=500来获得所需的行为。
发布于 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宏的示例程序。对于某些编译器设置,您可能会编译并运行它。
https://stackoverflow.com/questions/3355298
复制相似问题