10

I was trying to compile the code below (from https://stackoverflow.com/a/478960/683218). The compile went OK, if I compile with

$ g++ test.cpp

but went wrong when the -std=c++11 switch is used:

$ 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");
                                ^

Any idea what's going on?

(I am using mingw32 gcc4.8.1 from mingw.org, and on 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() {}
Community
  • 1
  • 1
thor
  • 21,418
  • 31
  • 87
  • 173
  • 5
    Unrelated to your *current* problem, but don't do `while (!feof(...))`, it will not work as you expect it to. The reason is because the `EOF` flag will not be set until *after* you try to read from beyond the end of the file, so you will iterate once to many. Instead in your case simply do `while (fgets(...) != 0)`. This is the same when reading from C++ streams as well. – Some programmer dude Mar 04 '14 at 08:37

2 Answers2

9

I think this happens because popen is not standard ISO C++ (it comes from POSIX.1-2001).

You could try with:

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

(-U cancels any previous definition of a macro, either built in or provided with a -D option)

or

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

(GCC defines __STRICT_ANSI__ if and only if the -ansi switch, or a -std switch specifying strict conformance to some version of ISO C or ISO C++, was specified when GCC was invoked)

Playing with the _POSIX_SOURCE / _POSIX_C_SOURCE macros is a possible alternative (http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html).

manlio
  • 18,345
  • 14
  • 76
  • 126
1

Just add this at the begining:

extern "C" FILE *popen(const char *command, const char *mode);
J3STER
  • 1,027
  • 2
  • 11
  • 28