popen implizit deklariert, obwohl #include hinzugefügt

Lesezeit: 3 Minuten

Benutzer-Avatar
Chris Allen

Dies ist ein kleiner Ausschnitt meines Codes.

   #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

Ich bin mir wirklich unsicher. Ich habe nach Popen gesucht und alles, was es benötigt, ist stdio.h, das bereitgestellt wird. Was fehlt oder ist das Problem im Rest meines Codes (ich möchte nicht wirklich mehr Code zeigen, weil es eine Zuweisung ist).

  • Vielleicht kompilieren Sie mit Optionen zu GCC wie z -ansi oder -std=c99; diese verhindern, dass die POSIX-Erweiterungen sichtbar sind. Um sie sichtbar zu machen, müssen Sie sie anfordern, indem Sie (zum Beispiel) angeben #define _XOPEN_SOURCE 500 (oder 600 oder 700), bevor Sie einen Systemheader einfügen.

    – Jonathan Leffler

    29. März 2011 um 6:59 Uhr

  • schöner verwandter Beitrag:

    – Ciro Santilli Путлер Капут 六四事

    22. Februar 2013 um 15:41 Uhr

Wie die Manpage sagt:

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

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

Deshalb solltest du #define _BSD_SOURCE oder einer der anderen davor #includeing stdio.h.

  • lass es mich ausprobieren. Das ist interessant, weil ich in der Vergangenheit Pipe verwendet habe (fast mit genau demselben Code) und es funktioniert hat. Irgendein Grund warum?

    – Chris Allen

    29. März 2011 um 5:56 Uhr

  • Hmm, es schien die Hälfte der Popen- und Pclose-Beschwerden zu beruhigen. Danke aber für deine Hilfe.

    – Chris Allen

    29. März 2011 um 6:03 Uhr

  • Sie sollten definieren _POSIX_C_SOURCE oder _XOPEN_SOURCE. Die anderen sind keine (aktuellen) Standards. _SVID_SOURCE mag einst ein Standard gewesen sein, aber das Alter von SVID liegt ungefähr 15 Jahre zurück …

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    29. März 2011 um 12:16 Uhr

  • Ich bekomme auch immer noch den gleichen Fehler. Ich nehme an, dass die Antwort veraltet ist.

    – Tomáš Zato – Wiedereinsetzung von Monica

    12. Mai 2014 um 12:03 Uhr

  • Die Manpage für popen(3) zeigt immer noch die gleichen Anforderungen. Der Header stdio.h zeigt diese Anforderungen auch deutlich: 867 #if (definiert __USE_POSIX2 || definiert __USE_SVID || definiert __USE_BSD || \ 868 definiert __USE_MISC) Ich bekomme hier keine Fehler mit -D_POSIX_C_SOURCE=2.

    – Konrad Meyer

    1. Juli 2014 um 18:24 Uhr


Ersetzen -std=c99 oder -std=c11 usw mit -std=gnu99 oder -std=gnu11.

  • ich ersetzte -std=c17 mit -std=gnu17. Hat funktioniert.

    – Gabriel Staples

    3. Februar um 22:35 Uhr

Ich habe die Prototypen von popen und pclose an den Anfang meines Codes gesetzt. Es schien das Problem erledigt zu haben.

  • Tun Sie das nicht – es ist ein schlechter Weg, um das Problem zu beheben. Verwenden Sie die Standard-Header und machen Sie die Definitionen richtig, damit es korrekt kompiliert wird. Und Sie sollten wahrscheinlich eine Antwort auf diese Frage akzeptieren.

    – Jonathan Leffler

    16. Juni 2011 um 22:20 Uhr

1107680cookie-checkpopen implizit deklariert, obwohl #include hinzugefügt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy