2016-07-07 48 views
0
隱式聲明

使用getchar_unlocked並用--std=c99標誌編譯給出warningas如下 -getchar_unlocked()在C99

警告:的函數 'getchar_unlocked'[-Wimplicit函數聲明]

隱式聲明如果編譯時沒有標記,不會給出任何警告。有沒有辦法解決它?

+4

'--std = c99'是一個嚴格的模式,你可以用'--std = gnu99'代替。沒有精力去嘗試,但有人可能:-) – paxdiablo

+1

@paxdiablo,是的,應該工作,當想要使用C標準的擴展,即POSIX,不應該限制編譯器裸露C99。無論如何,更好的辦法是切換到'gnu11',這似乎是新版gcc版本的默認設置。 –

回答

2

從C99開始,在調用函數之前必須有一個可見的函數原型。雖然較早的C標準只是愚蠢地假設編譯器未知的任何函數的格式爲int func (params),而這又會導致大多數時間出現嚴重錯誤。

正確申報getchar_unlocked的原型,該錯誤將消失。

請注意,任何標準庫都不存在這樣的功能。看起來您可能需要爲編譯器包含一些非標準庫才能找到該函數。

+0

這不完全正確。函數原型類型存在於stdio.h中,但在['bare'] ansii C中不可見。由於該函數來自posix定義,因此必須在源代碼中包含以下#defined之一: 'POSIX_C_SOURCE> = 1 || _XOPEN_SOURCE || _POSIX_SOURCE || _BSD_SOURCE || _SVID_SOURCE' - 或 - 選擇一個'gcc'選項-std = xxx,其中包含posix函數,如'-std = gnu99' – user3629249

0

getchar_unlocked不是C標準功能。

編譯強制c99標準本身不支持它。

3

_unlocked版本的get...函數是POSIX擴展。它們不是C99標準功能的一部分。函數的完整列表在7.19.1.5中給出:getwcgetwchar,getc,getchargets(不建議使用)。

當函數不在此列表中時,符合C99的編譯器必須警告您,您的程序可能無法與其他符合C99的編譯器一起編譯。

+0

相反,符合的編譯器不允許在標準庫中自由轉儲任何非標準廢話頭。他們必須遵循[命名約定](http://stackoverflow.com/questions/8270324/is-a-compiler-allowed-to-add-functions-to-standard-headers),他們不能給一個函數一個像'getchar_unlocked'這樣的名稱並放在stdio.h中。標準C和功能失常的POSIX標準之間顯然還有一個衝突。 – Lundin

+0

@倫丁,爲什麼會是衝突? POSIX擴展了C標準,就這麼清楚地說明了這一點。要使用它,你必須告訴編譯器你需要它。 '-std = c99'完全相反,你想要純粹的C99並且沒有擴展名。 –

+0

@JensGustedt POSIX應該是操作系統API的標準。它不應該涉及干涉編程語言的標準。它沒有理由引起非標準行爲。它可以像任何其他第三方庫一樣和平共處C,但不會,這太聰明瞭......這一切都歸結爲C和Unix從一開始就彼此嚴重纏繞在一起,而POSIX起源於來自* nix。他們沒有制定適用於任何操作系統的標準,而是制定了一個標準「在Unix中完成」。 – Lundin

1

方言選擇選項如-ansi-std=c99會導致編譯器定義某些宏(除了改變接受的方言外)。

庫頭文件對這些宏作出反應。

準確地說,它們的反應與系統相關(編譯器不提供C庫),但您可以普遍期望的一種常見行爲是,如果您單獨使用這些標誌之一(沒有任何其他「功能選擇宏「),它具有隱藏不在指定ISO C方言中的函數,宏和其他全局符號的聲明的效果。

ISO C對getchar_unlocked一無所知。在<stdio.h>(通常是ISO C標頭)中存在這樣的聲明是POSIX擴展,基本上不符合,因爲getchar_unlocked是嚴格符合C程序可以使用的標識符,即使它們包括<stdio.h>。當您使用-ansi-std=c99時,<stdio.h>標頭會偵聽並將自己甩成符合ISO-C標準的形狀,從而隱藏此類擴展。

在乖巧的POSIX系統,你可以要求你想要的,你想某些基本的1990年上下的POSIX功能是在頭文件中可見的ISO C方言,比如像這樣:

gcc -std=c99 -D_POSIX_SOURCE ... 
       ^^^^^ "feature selection macro" 

這些特徵選擇宏有一個完整的科學,對於這個問題和答案來說太寬泛;它們的某些形式具有值,如-D_XOPEN_SOURCE=500_POSIX_SOURCE不需要參數;它只是被定義或不是,但_POSIX_C_SOURCE是數字。

我剛剛檢查了glibc和Cygwin:兩者都有,_POSIX_SOURCE就足以顯示getchar_unlocked聲明。這是相當古老的,可以追溯到POSIX.1 1996.

注意:在某些系統上,多個功能選擇宏不能合理地播放;他們給你一個交集而不是聯合,所以-D_POSIX_SOURCE-D_BSD_SOURCE一起最終意味着「只向我聲明那些在POSIX中已經標準化的傳統BSD特有的那些功能」,這意味着幾乎沒有什麼是聲明。