我有一些现有的代码,我试图使用来自llvm.org的clang 3.3和libc ++进行编译。检索另一个命令结果的简单步骤。似乎std :: filebuf不再提供FILE *构造函数,并且我尝试替换代码的所有想法都无法打开命令,即fb.is_open()始终返回false。
根据我的发现,我必须使用类似fb.open(cppcommand.c_str(), std::ios::in);
而不是popen的东西。
代码的基本部分是: -
std::string cppcommand = "/usr/bin/cpp -xc -nostdinc test.c";
FILE *cpppipe = popen (cppcommand.c_str(), "r");
std::filebuf fb (cpppipe);
if (! cpppipe || ! fb.is_open()) {
std::cerr << "Could not run '" << cppcommand.c_str() << "'\n";
return false;
} else {
std::istream in (&fb);
std::ostringstream ss;
ss << in.rdbuf();
result = ss.str();
}
如何使用libc ++运行?
代码来自OpenShadingLanguage,我试图让它在FreeBSD 10.0 Beta1下编译,它包含从基础安装中删除gcc和libstdc ++后的clang 3.3和libc ++。
如果手动粘贴到终端,正在使用的cppcommand字符串运行时没有错误。
答案 0 :(得分:3)
实际上std::filebuf
从不提供了一个FILE*
的构造函数。你已成为gcc扩展的牺牲品。
C ++ I / O系统是非常易于扩展的,尽管它是一种相当古老的方式。在完全可移植的C ++中创建可以从streambuf
构造的自定义FILE*
并不困难。通常我只是把代码放在这里。然而,答案有点长。通常我不会无耻地插入产品而不是提供答案。
在这种情况下,我正在例外。
Josuttis'"The C++ Standard Library"显示了如何在第15.13.3节中为POSIX文件描述符执行此操作。采用此代码来使用FILE*
而不是POSIX文件描述符将是微不足道的。
如果这是你唯一能从尼古拉的书中得到的东西,我可能不会推荐它。然而,情况远非如此。我推荐这本书。