簡體   English   中英

在 C90 中使用 snprintf

[英]Using snprintf with C90

有沒有辦法指示編譯器:

  • 語言是C90
  • stdio.h 的聲明是 C99 的聲明(包括 snprintf)

使用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.

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