【问题标题】:Use open_memstream with c99将 open_memstream 与 c99 一起使用
【发布时间】:2017-11-30 13:08:31
【问题描述】:

我正在尝试在我的 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]

【问题讨论】:

  • 错误的宏。永远不要定义那些。阅读man open_memstream
  • 另外,我看不出有任何问题。无论您对这些警告(不是错误,顺便说一句)感到困惑,我们都无法读懂您的想法。您需要告诉我们其中哪些部分让您感到困惑,以便我们帮助纠正这种困惑。
  • @Sebivor "这不是错误" 请不要大声说出来,有人可能会觉得你不知道他们是致命的。
  • @n.m. “它们是致命的”对于任何实现定义的东西都是无效的,因为它们可能不在某些系统上。您是否有任何确凿的资料来支持该声明?
  • @Sebivor“警告”在标准中不存在。该标准讨论了诊断。我不是在谈论标准。我说的是来自这个特定实现的这些特定警告。

标签: c posix c99


【解决方案1】:

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

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

  • 如果您有一些具体的理由想要选择一个旧的、严格的一致性模式,而且您想要对 C 进行 POSIX 扩展,那么您可以使用 记录的 POSIX 功能选择宏:

    #define _XOPEN_SOURCE 700
    

    #define _POSIX_C_SOURCE 200809L
    

    这些必须在包含 任何 标准标题之前定义。不同之处在于_XOPEN_SOURCE 请求了一组额外的功能(“XSI”功能)。请参阅 glibc 手册的Feature Test macros 部分了解更多详细信息。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多