Popen неявно объявлен, хотя добавлен #include <stdio.h>
Это маленький фрагмент кода.
#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, который предоставляется. То, что отсутствует, или проблема в остальной части моего кода (я действительно не хочу показывать больше кода, потому что это назначение).
Ответы
Ответ 1
Как говорится в man-странице:
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
ing stdio.h
.
Ответ 2
Замените -std=c99
или -std=c11
и т.д. с помощью -std=gnu99
или -std=gnu11
.
Ответ 3
Я помещаю прототипы popen и pclose в начало моего кода. Это, похоже, решило проблему.