2009-12-13 42 views
7

在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开发中没有明确声明的函数吗?

+1

你是如何编译它的? – 2009-12-13 22:39:41

+0

我在用gcc -ansi -pedantic -Wall编译 – Steven 2009-12-13 22:49:16

+0

@Steven“grep getopt /usr/include/*.h”返回什么? – Scooter 2012-08-18 05:04:33

回答

1

手册页说包含stdio.h而不是stdlib.h。包括stdio.h是否解决问题?

+0

不,我会更新问题以反映 – Steven 2009-12-13 22:48:17

+0

而不是--ansi,如果您想明确标准,可以使用-std = standard。例如:-std = gnu90编译没有任何警告,并且是当前的默认设置(当省略-std时)。 – 2013-02-11 16:10:01

9

您正在编译-ansi,并且在该模式下getopt可能不可用,因为-ansi意味着C89一致性模式。尝试删除该开关,或在#include <unistd.h>之前#define _GNU_SOURCEgetopt()是POSIX,而不是ANSI。您可能并不需要_GNU_SOURCE。据this,你应该能够定义预处理器宏,这是真的得到的功能:

#if _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _POSIX_SOURCE 

有关功能测试宏的更多信息,请参见this

+0

删除-ansi确实删除了警告。但是,我不知道为什么getopt()不符合C89时,我使用的其他POSIX函数没有给出任何警告 #define _GNU_SOURCE虽然没有(这是Solaris) – Steven 2009-12-13 23:02:17

+0

请参阅我的编辑。 C89没有定义getopt:因此,在C89模式下编译时,glibc会暴露它是错误的。虽然,因为它是在unistd.h中声明的,所以在C89中不存在,也许glibc可以做到这一点,但我不确定。 – 2009-12-13 23:03:44

1

使用gnu99解决了这个问题对我来说:

gcc -std=gnu99 file.c 

这是unistd.h