【问题标题】:Why does -std=c11 with gcc hide popen in stdio.h? [duplicate]为什么使用 gcc 的 -std=c11 在 stdio.h 中隐藏 popen? [复制]
【发布时间】:2018-11-10 20:11:25
【问题描述】:

我想使用 popen。它在 stdio.h 中。我包括了它,但编译器看不到它 -std=c11。它确实在没有 -std=c11 的情况下编译。

#include <stdio.h>

int main(void)
{
   popen("ls *","r");
}

gcc -std=c11 popen_test.c

popen_test.c:在函数“main”中:
popen_test.c:5:4: 警告:函数‘popen’的隐式声明 [-Wimplicit-function-declaration]

popen("ls *","r");
^~~~~

它隐藏在stdio.h中

#ifdef __USE_POSIX2

手册页说它在以下情况下可用:

_POSIX_C_SOURCE >= 2 || /* Glibc 版本

【问题讨论】:

  • popen 不是标准 C 的一部分。
  • @melpomene 能否在源码中开启和关闭-std=c11?
  • 你这是什么意思?或者也许是一个更好的问题:您想通过指定 -std=c11 来达到什么目的?
  • @melpomene 我想要C11的所有功能
  • 好吧,例如-std=gnu11 会给你加上所有 GNU 扩展。

标签: c popen


【解决方案1】:

popen 不是 C 的一部分。要获得它,您需要在包含任何内容之前使用 feature test macro 启用它。

最简单的方法是在顶部使用#define _GNU_SOURCE(或在编译器调用中使用-D_GNU_SOURCE)。

使用 -std=c11 编译:

#define _GNU_SOURCE
#include <stdio.h>

int main(void)
{
   popen("ls *","r");
}

【讨论】:

  • -std=c11 是否意味着“不允许任何不属于 C11 的内容”?我希望“允许任何属于 C11 的内容”。
  • @Scooter 我想说这更像是在没有特定标准的情况下调用 gcc 会给你一些额外的 gnu 东西(-std=gnu11 或任何你的编译器默认的东西)。 -std=c11 禁用它,这样 C 标准所说的应该属于你的标识符就不会被占用。
  • @Scooter int popen; int main(void) { return popen; } 是一个有效的 C11 程序,但它会与 popen 函数冲突。
猜你喜欢
  • 2015-08-17
  • 2011-04-20
  • 2012-11-20
  • 2015-03-29
  • 1970-01-01
  • 2013-05-17
  • 2011-11-03
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多