Solaris中的getopt隐式声明?
在Solaris中,GCC编译Solaris中的getopt隐式声明?
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
getopt(1,argv,"");
return 0;
}
的man page为getopt的时候给我的函数'getopt的”
的
隐含的声明说,有关包括unistd.h中或标准输入输出。小时,但是即使我包括两个我仍然得到这个警告。这是正常的吗?使用的是Unix开发中没有明确声明的函数吗?
手册页说包含stdio.h
而不是stdlib.h
。包括stdio.h
是否解决问题?
不,我会更新问题以反映 – Steven 2009-12-13 22:48:17
而不是--ansi,如果您想明确标准,可以使用-std = standard。例如:-std = gnu90编译没有任何警告,并且是当前的默认设置(当省略-std时)。 – 2013-02-11 16:10:01
您正在编译-ansi
,并且在该模式下getopt
可能不可用,因为-ansi
意味着C89一致性模式。尝试删除该开关,或在#include <unistd.h>
之前#define _GNU_SOURCE
。 getopt()
是POSIX,而不是ANSI。您可能并不需要_GNU_SOURCE
。据this,你应该能够定义预处理器宏,这是真的得到的功能:
#if _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _POSIX_SOURCE
有关功能测试宏的更多信息,请参见this。
删除-ansi确实删除了警告。但是,我不知道为什么getopt()不符合C89时,我使用的其他POSIX函数没有给出任何警告 #define _GNU_SOURCE虽然没有(这是Solaris) – Steven 2009-12-13 23:02:17
请参阅我的编辑。 C89没有定义getopt:因此,在C89模式下编译时,glibc会暴露它是错误的。虽然,因为它是在unistd.h中声明的,所以在C89中不存在,也许glibc可以做到这一点,但我不确定。 – 2009-12-13 23:03:44
使用gnu99解决了这个问题对我来说:
gcc -std=gnu99 file.c
这是unistd.h
。
你是如何编译它的? – 2009-12-13 22:39:41
我在用gcc -ansi -pedantic -Wall编译 – Steven 2009-12-13 22:49:16
@Steven“grep getopt /usr/include/*.h”返回什么? – Scooter 2012-08-18 05:04:33