我正在尝试编译下面的代码(来自https://stackoverflow.com/a/478960/683218)。 如果我用
编译,编译就可以了$ g++ test.cpp
但在使用-std=c++11
开关时出错:
$ 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");
^
知道发生了什么事吗?
(我在mingw.org和WindowsXP64上使用mingw32 gcc4.8.1)
代码:
#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() {}
答案 0 :(得分:6)
我认为这是因为popen
不是标准的ISO C ++(它来自POSIX.1-2001)。
您可以尝试:
$ g++ -std=c++11 -U__STRICT_ANSI__ test.cpp
(-U
取消之前定义的宏,无论是内置还是提供-D
选项)
或
$ g++ -std=gnu++11 test.cpp
(GCC defines __STRICT_ANSI__
当且仅当指定了-ansi
开关或指定严格符合某些版本的ISO C或ISO C ++的-std
开关时当GCC被调用时)
使用_POSIX_SOURCE
/ _POSIX_C_SOURCE
宏可能是另一种选择(http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html)。
答案 1 :(得分:0)
只需在开头添加:
extern "C" FILE *popen(const char *command, const char *mode);