popen隐式声明,即使添加了#include <stdio.h> </stdio.h>

时间:2011-03-29 05:37:24

标签: c declaration pipe implicit stdio

这是我代码的一小部分。

   #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。缺少什么,或者是我的其余代码中的问题(我真的不想显示更多代码,因为它是一个赋值)。

3 个答案:

答案 0 :(得分:12)

正如手册页所说:

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

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

因此,在#define _BSD_SOURCE #include stdio.h之前,您应该{{1}}或其中一个。

答案 1 :(得分:5)

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

答案 2 :(得分:-5)

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