2013-10-22 53 views
0

我有一些现有的代码,我尝试使用clang 3.3和libC++从llvm.org进行编译。一个简单的步骤来检索另一个命令的结果。看来,std :: filebuf不再提供FILE *构造函数,并且我试图替换代码的所有想法都未能打开该命令,即fb.is_open()始终返回false。将std :: filebuf(FILE *)转换为使用libC++

从我能找到的,我将不得不使用像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字符串将无误地运行。

回答

3

实际上std::filebuf从来没有提供了一个构造函数采取FILE*。你已经成为gcc扩展的受害者。

C++ I/O系统非常具有可扩展性,尽管它非常古老。创建一个自定义的streambuf并不难,它可以通过一个FILE*构建,并且可以在完美的便携式C++中使用。通常我只是把代码放在这里。然而,答案有点长。通常我不会无耻地插入产品而不是提供答案。

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

Josuttis'"The C++ Standard Library"显示了如何在第15.13.3节中为POSIX文件描述符做到这一点。采用此代码来代替POSIX文件描述符使用FILE*将是微不足道的。

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