2014-03-04 9 views
6

Ich habe versucht, den folgenden Code zu kompilieren (von https://stackoverflow.com/a/478960/683218). Die Kompilierung ging in Ordnung, wenn ich mitmingw: funktion nicht gefunden, wenn mit -std = C++ 11

$ g++ test.cpp 

kompilieren aber ging schief, wenn der -std=c++11 Schalter verwendet wird:

$ g++ -std=c++11 test.cpp 
test.cpp: In function 'std::string exec(char*)': 
test.cpp:6:32: error: 'popen' was not declared in this scope 
    FILE* pipe = popen(cmd, "r"); 
           ^

Jede Idee, was los ist?

(Ich verwende mingw32 gcc4.8.1 von mingw.org und auf WindowsXP64)

Code:

#include <string> 
#include <iostream> 
#include <stdio.h> 

std::string exec(char* cmd) { 
    FILE* pipe = popen(cmd, "r"); 
    if (!pipe) return "ERROR"; 
    char buffer[128]; 
    std::string result = ""; 
    while(!feof(pipe)) { 
     if(fgets(buffer, 128, pipe) != NULL) 
      result += buffer; 
    } 
    pclose(pipe); 
    return result; 
} 

int main() {} 
+4

Unrelated auf Ihren * Strom * Problem, aber nicht tun, '', während, wird es nicht funktionieren wie erwartet (feof (...)!) es zu. Der Grund dafür ist, dass das 'EOF'-Flag nicht gesetzt wird, bevor * Sie * versuchen, über das Ende der Datei hinaus zu lesen, so dass Sie zu vielen Iterationen übergehen. Stattdessen in Ihrem Fall einfach 'while (fgets (...)! = 0)'. Dies ist auch beim Lesen von C++ - Streams der Fall. –

Antwort

5

Ich denke, dies geschieht, weil popen nicht Standard ISO C++ ist (es von POSIX kommt .1-2001).

Sie könnten versuchen, mit:

$ g++ -std=c++11 -U__STRICT_ANSI__ test.cpp 

(-U jede vorherige Definition eines Makros storniert, entweder eingebaut oder mit einer -D Option)

oder

$ g++ -std=gnu++11 test.cpp 

(GCC defines__STRICT_ANSI__ wenn und nur wenn der -ansi Schalter oder ein -std s Hexe Angabe strenge Konformität mit einigen Versionen von ISO C oder ISO C++, angegeben wurde, als GCC aufgerufen wurde)

mit den _POSIX_SOURCE/_POSIX_C_SOURCE Makros zu spielen, ist eine mögliche Alternative (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html).

+0

Danke. Das hat es getan. – tinlyx

0

Fügen Sie einfach diese am Anfang:

extern "C" FILE *popen(const char *command, const char *mode);