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() {}
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).