1

我有一些现有的代码,我正在尝试使用来自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,在从基本安装中删除 gcc 和 libstdc++ 后,我试图让它在包含 clang 3.3 和 libc++ 的 FreeBSD 10.0 Beta1 下编译。

如果手动粘贴到终端,正在使用的 cppcommand 字符串运行不会出错。

4

1 回答 1

4

实际上std::filebuf从未提供构造函数采用FILE*. 您已经成为 gcc 扩展的受害者。

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

在这种情况下,我例外。

Josuttis 的“C++ 标准库”在第 15.13.3 节中展示了如何为 POSIX 文件描述符执行此操作。采用此代码来使用 aFILE*而不是 POSIX 文件描述符将是微不足道的。

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

于 2013-10-22T23:48:40.373 回答