簡體   English   中英

將open_memstream與c99一起使用

[英]Use open_memstream with c99

我試圖在我的C代碼中使用open_memstream函數。 但是我似乎無法編譯它。 最小的工作示例如下:

#include <stdio.h>

int main(void) {
    char *buf;
    size_t sz;

    FILE *stream = open_memstream(&buf, &sz);
    putc('A', stream);
    fclose(stream);
}

我還使用以下命令編譯它:

gcc -std=c99 -o test test.c

經過一些研究,我發現在包含stdio.h之前我需要定義一個宏。 但是,以下示例代碼無濟於事。

#define __USE_POSIX
#define __USE_XOPEN
#include <stdio.h>

拋出以下編譯器警告; 我假設第二個警告是因為第一個警告。

test.c:7:17: warning: implicit declaration of function ‘open_memstream’ [-Wimplicit-function-declaration]
FILE *stream = open_memstream(&buf, &sz);
             ^
test.c:7:17: warning: initialization makes pointer from integer without a cast [-Wint-conversion]

__USE_*宏是glibc頭文件的內部,自己定義它們不起作用。 您應該改為執行以下操作之一:

  • 使用-std=gnu11而不是-std=c99編譯程序,並且不要定義任何特殊的宏。 這是最簡單的改變。 方便地, -std=gnu11是較新版本的GCC的默認值。

  • 如果您有一些具體的理由想要選擇舊的,嚴格的一致性模式,但是您希望POSIX擴展到C,那么您可以使用記錄的 POSIX功能選擇宏:

     #define _XOPEN_SOURCE 700 

    要么

     #define _POSIX_C_SOURCE 200809L 

    必須在包含任何標准標頭之前定義它們。 不同之處在於_XOPEN_SOURCE請求一組額外的功能(“XSI”功能)。 有關更多詳細信息,請參閱glibc手冊的“ 功能測試宏”部分。

    請注意,如果您需要從庫中請求嚴格的一致性模式,使用-std=cXX選項,那么您幾乎肯定也想使用-Wall-Wpedantic選項來啟用對該語言的嚴格一致性檢查。 (你至少應該使用-Wall即使你並不需要嚴格的一致性檢查。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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