转换std :: filebuf(FILE *)以使用libc ++

时间:2013-10-22 20:08:50

标签: freebsd clang++ libc++

我有一些现有的代码,我试图使用来自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字符串运行时没有错误。

1 个答案:

答案 0 :(得分:3)

实际上std::filebuf 从不提供了一个FILE*的构造函数。你已成为gcc扩展的牺牲品。

C ++ I / O系统是非常易于扩展的,尽管它是一种相当古老的方式。在完全可移植的C ++中创建可以从streambuf构造的自定义FILE*并不困难。通常我只是把代码放在这里。然而,答案有点长。通常我不会无耻地插入产品而不是提供答案。

在这种情况下,我正在例外。

Josuttis'"The C++ Standard Library"显示了如何在第15.13.3节中为POSIX文件描述符执行此操作。采用此代码来使用FILE*而不是POSIX文件描述符将是微不足道的。

如果这是你唯一能从尼古拉的书中得到的东西,我可能不会推荐它。然而,情况远非如此。我推荐这本书。