[英]getchar_unlocked() implicit declaration in C99
使用getchar_unlocked
並使用--std=c99
標志進行編譯會產生如下警告:
警告:函數'getchar_unlocked'的隱式聲明[-Wimplicit-function-declaration]
如果不帶標志進行編譯,則不會發出任何警告。是否有任何解決方法?
從C99開始,在調用函數之前必須具有可見的函數原型。 盡管較早的C標准只是愚蠢地假設編譯器未知的任何函數都具有int func (params)
格式,這反過來在大多數情況下會導致嚴重的錯誤。
正確聲明getchar_unlocked
的原型,該錯誤將消失。
請注意,任何標准庫中都不存在此類功能。 看來您可能必須包括一些非標准的庫,編譯器才能找到該函數。
_unlocked
版本的get...
函數是POSIX擴展。 它們不是C99標准功能的一部分。 get...
函數的完整列表在7.19.1.5中給出: getwc
, getwchar
, getc
, getchar
和gets
(不推薦使用)。
當該函數不在此列表中時,符合C99的編譯器必須警告您程序不能與其他符合C99的編譯器一起編譯。
方言選擇選項(例如-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系統上,您可以要求您使用ISO C語言, 並希望某些基本的1990年代式POSIX功能在頭文件中可見,例如:
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的少數功能”。什么都沒有宣布。
getchar_unlocked
不是C標准函數。
強制c99
標准對其進行編譯本身不支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.