将open_memstream与c99一起使用

时间:2017-11-30 13:08:31

标签: c posix 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]

1 个答案:

答案 0 :(得分:5)

__USE_*宏是glibc标头内部的,自己定义它们不起作用。您应该执行以下操作之一:

  • 使用-std=gnu11代替-std=c99编译您的程序,并且不要定义任何特殊的宏。这是最简单的改变。方便的是,-std=gnu11是新版GCC的默认设置。

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

    #define _XOPEN_SOURCE 700
    

    #define _POSIX_C_SOURCE 200809L
    

    必须在包含任何标准标头之前定义它们。区别在于_XOPEN_SOURCE请求一组额外的功能(&#34; XSI&#34;功能)。有关详细信息,请参阅glibc手册的Feature Test macros部分。

    请注意,如果您需要使用-std=cXX选项从请求严格的一致性模式,那么您几乎肯定也想使用-Wall和{{ 1}}选项,用于对语言进行严格的一致性检查。 (即使您 需要严格的一致性检查,您也应该至少使用-Wpedantic。)