2013-10-22 51 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的書中得到的唯一的東西,我可能不會推薦它。然而,這遠非如此。我推薦這本書。