[英]Using snprintf with C90
有沒有辦法指示編譯器:
使用cc -std=c90 -Wall
(在使用 snprintf 的源文件上),會發出令人討厭的警告(有時,取決於編譯器/環境,帶有令人困惑的提示,即應包含 stdio.h,即使它已經包含) ,但鏈接器無論如何都會找到 snprintf 。 我明白發生了什么,這不是問題。
使用嚴格的 c90(語言)和 snprintf(庫函數)在技術上是可行的,但我不知道如何相應地指示編譯器。 換句話說,我想區分語言合規性和庫合規性。
備注:我假設 C99 stdio.h 頭文件中使用的語言實際上是 C90,因此它可以包含在 C90 源文件中。 有什么可以阻止它嗎?
為了可移植性,我更喜歡帶有通用include <stdio.h>
的解決方案。
不。
C90 編譯器的通用#include <stdio.h>
不需要聲明snprintf
。
在您爭辯說它不是 C90 編譯器之前,請記住您要求它充當一個 usng -std=c90
。 作為 C90 編譯器的編譯器不需要做任何 C90 編譯器不會做的事情。
因此沒有通用的解決方案。
可能有特定於編譯器的解決方案,包括添加以下內容:
int snprintf( char * buffer, size_t bufsz, const char * format, ... );
是的,雖然這樣做有點奇怪。
您可以定義_ISOC99_SOURCE
來表示您希望定義 C99 函數。
例子:
#define _ISOC99_SOURCE
#include <features.h>
#include <stdio.h>
int main() {
char buf[10];
snprintf(buf, 4, "foo");
puts(buf);
return 0;
}
像這樣編譯它:
$ gcc -std=c90 -Wall test.c
$ ./a.out
foo
這將適用於 gcc 10.3.0 和 clang 11.0.0。 在庫兼容性方面,只用glibc測試過,沒有用musl或其他版本的標准庫測試過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.