将open_memstream与c99一起使用

Ber*_*ert 3 c posix c99

我想open_memstream在我的C代码中使用该函数.但是我似乎无法编译它.最小的工作示例如下:

#include <stdio.h>

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

    FILE *stream = open_memstream(&buf, &sz);
    putc('A', stream);
    fclose(stream);
}
Run Code Online (Sandbox Code Playgroud)

我还使用以下命令编译它:

gcc -std=c99 -o test test.c

经过一些研究,我发现在包含之前我需要定义一个宏stdio.h.但是,以下示例代码无济于事.

#define __USE_POSIX
#define __USE_XOPEN
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

抛出以下编译器警告; 我假设第二个警告是因为第一个警告.

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]
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 5

__USE_*宏是内部的glibc的头,并定义它们自己不工作.您应该改为执行以下操作之一:

  • 编译程序-std=gnu11-std=c99不是定义任何特殊的宏.这是最简单的改变.方便的-std=gnu11是,GCC的新版本是默认版本.

  • 如果您有一些具体的理由想要选择旧的,严格的一致性模式,但是您希望POSIX扩展到C,那么您可以使用记录的 POSIX功能选择宏:

    #define _XOPEN_SOURCE 700
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    #define _POSIX_C_SOURCE 200809L
    
    Run Code Online (Sandbox Code Playgroud)

    必须在包含任何标准标头之前定义它们.不同之处在于_XOPEN_SOURCE请求一组额外的功能("XSI"功能).有关更多详细信息,请参阅glibc手册的" 功能测试宏"部分.

    请注意,如果您需要使用选项从库中请求严格的一致性模式-std=cXX,那么您几乎肯定也希望使用-Wall-Wpedantic选项来启用对语言的严格一致性检查.(你至少应该使用-Wall,即使你并不需要严格的一致性检查.)