将open_memstream与c99一起使用

将open_memstream与c99一起使用,c,posix,c99,C,Posix,C99,我试图在我的C代码中使用open\u memstream函数。然而,我似乎无法编译它。最低限度的工作示例如下: #include <stdio.h> int main(void) { char *buf; size_t sz; FILE *stream = open_memstream(&buf, &sz); putc('A', stream); fclose(stream); } 抛出以下编译器警告;我想第二个警告是因为

我试图在我的C代码中使用
open\u memstream
函数。然而,我似乎无法编译它。最低限度的工作示例如下:

#include <stdio.h>

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

    FILE *stream = open_memstream(&buf, &sz);
    putc('A', stream);
    fclose(stream);
}
抛出以下编译器警告;我想第二个警告是因为第一个

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]

\uuu\u USE.*
宏是glibc头的内部,自己定义它们是行不通的。您应该改为执行以下操作之一:

  • -std=gnu11
    而不是
    -std=c99
    编译程序,并且不要定义任何特殊的宏。这是最容易的改变。方便地说,
    -std=gnu11
    是新版本GCC的默认值

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

    #define _XOPEN_SOURCE 700
    

    必须在包含任何标准标题之前定义这些标题。不同之处在于
    \u XOPEN\u SOURCE
    请求一组附加功能(“XSI”函数)。有关更多详细信息,请参阅glibc手册的章节

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


错误的宏。永远不要给它们下定义。阅读
man open\u memstream
。此外,我看不到任何问题。不管你对这些警告(顺便说一句,它们不是错误)感到困惑,我们都无法读懂你的心思。您需要告诉我们它们的哪一部分让您感到困惑,以便我们能够帮助纠正这种困惑。@Sebivor“哪些不是错误”请不要大声说出来,有人可能会觉得您不知道它们是致命的。@n.m.“它们是致命的”对于任何实现定义的内容都是无效的,因为它们可能不在某些系统上。您是否有任何确凿的来源支持该声明?@Sebivor“警告”在标准中不存在。该标准涉及诊断。我不是说标准。我说的是这个具体实现中的这些具体警告。
#define _XOPEN_SOURCE 700
#define _POSIX_C_SOURCE 200809L