【问题标题】:Convert std::filebuf(FILE*) to use libc++将 std::filebuf(FILE*) 转换为使用 libc++
【发布时间】:2013-10-22 20:08:49
【问题描述】:

我有一些现有代码,我正在尝试使用来自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 字符串运行不会出错。

【问题讨论】:

    标签: freebsd clang++ libc++


    【解决方案1】:

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

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

    在这种情况下,我要破例。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 2022-10-16
      相关资源
      最近更新 更多