2009-12-13 21 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