【问题标题】:popen implicitly declared even though #include <stdio.h> is added即使添加了#include <stdio.h>,popen 也会隐式声明
【发布时间】:2011-07-25 00:14:30
【问题描述】:

这是我代码的小sn-p。

   #include <stdio.h>
   #include <unistd.h>
   #include <stdlib.h>
   #include <time.h>
   #include <sys/stat.h>
   #include <sys/wait.h>
   #include <sys/types.h>
   #include <string.h>
   #include <sys/types.h>
   #include <sys/socket.h>
   #include <netinet/in.h>
   #include <arpa/inet.h>
    ...

   FILE * pipe;
    ...

   pipe = popen ("ls /tmp -1", "r");
    ...
   pclose(pipe);

blarg.c:106: warning: implicit declaration of function ‘popen’

blarg.c:106: warning: assignment makes pointer from integer without a cast

blarg.c:112: warning: implicit declaration of function ‘pclose’

blarg.c:118: warning: assignment makes pointer from integer without a cast

我真的不确定。我查找了 popen,它只需要提供的 stdio.h。缺少什么,或者是我的其余代码中的问题(我真的不想显示更多代码,因为它是一个赋值)。

【问题讨论】:

  • 也许您正在使用 GCC 的选项进行编译,例如 -ansi-std=c99;这些会阻止 POSIX 扩展可见。要使它们可见,您必须在包含任何系统标头之前通过(例如)指定 #define _XOPEN_SOURCE 500(或 600 或 700)来请求它们。
  • 不错的相关帖子:stackoverflow.com/questions/5378778/…>

标签: c declaration pipe implicit stdio


【解决方案1】:

正如手册页所说:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

popen(), pclose(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _BSD_SOURCE
|| _SVID_SOURCE

所以你应该在#includeing stdio.h 之前#define _BSD_SOURCE 或其他人之一。

【讨论】:

  • 让我试试看。这很有趣,因为我过去使用过管道(几乎使用完全相同的代码)并且它有效。有什么原因吗?
  • 嗯,它似乎平息了一半的 popen 和 pclose 抱怨。不过感谢您的帮助。
  • 您应该定义_POSIX_C_SOURCE_XOPEN_SOURCE。其他不是(当前)标准。 _SVID_SOURCE 可能曾经是一个标准,但 SVID 的年龄已经过去了 15 年......
  • 我仍然遇到同样的错误。我认为答案已经过时了。
  • popen(3) 的手册页仍然显示相同的要求。 stdio.h 标头也清楚地显示了这些要求: 867 #if (defined __USE_POSIX2 || defined __USE_SVID || defined __USE_BSD || \ 868 defined __USE_MISC) 我在这里没有遇到任何错误 -D_POSIX_C_SOURCE=2。
【解决方案2】:

-std=c99-std=c11 等替换为-std=gnu99-std=gnu11

【讨论】:

  • 我将-std=c17 替换为-std=gnu17。工作。
【解决方案3】:

我将 popen 和 pclose 的原型放在代码的顶部。它似乎解决了这个问题。

【讨论】:

  • 不要那样做——这是解决问题的坏方法。使用标准头文件,并获得正确的定义,以便正确编译。你可能应该接受这个问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多