簡體   English   中英

C99中的getchar_unlocked()隱式聲明

[英]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中給出: getwcgetwchargetcgetchargets (不推薦使用)。

當該函數不在此列表中時,符合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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM