2011-10-24 39 views
4

我的問題是在經歷了一次挫折後,實際上我最近研究了標準C++ IO庫。我在Linux機器上開發,所以一切都很好。因爲我對文件io(file.exceptions(flags))使用了異常處理,而舊版本的GNU C++編譯器不支持它。實際的部署機器具有非常舊版本的g ++,可能是2.9倍的東西。我正在寫一個數據記錄器應用程序,因爲我寫了很多依賴於try-catch對的代碼。我現在應該怎麼做。我試過聲明一個從std :: exception繼承的異常。有用。將fstream封裝在頭文件中是一個好主意。如果是的話,我應該怎麼做,像繼承,或只是換行?遺留在傳統C++ IO庫和標準IO庫之間

+2

WOW,g ++ 2.9x !!! – AraK

+3

不把舊的編譯器優先於新版本的原因是什麼? – Nawaz

+0

與@Nawaz提出的問題一樣:爲什麼不轉向更新版本的g ++? –

回答

1

由於您已經使用linux & gcc,所以開始使用GNU autotools可能是個好主意。解決這種類型的可移植性問題是自動工具的核心目的之一。

自動工具將生成一個名爲config.h的文件,其中包含一組#define,用於指示環境中是否存在某些功能。 (在這種情況下,AC_CXX_EXCEPTIONS很可能是您想要的檢查。)然後,您可以使用#ifdef標記讓預處理器排除您爲了與舊編譯器兼容而編寫的代碼,只要配置腳本發現它們不是必需的。

第一次使用autotools有點僵化的學習曲線,但這是一次性的時間成本。他們會讓你開始的每個未來項目都更容易設置。您還需要檢查目標機器是否支持自動工具,以及是否支持哪些版本的工具。

+0

是的,目標支持自動工具,我可以在這裏找到解決方法,尚未在目標上進行測試。我發佈它作爲答案。有例外,但它們不適用於IO流庫。 – NekDil

0

這是我的解決辦法,compatible.h文件:

#ifndef __COMPATIBLE 
#define __COMPATIBLE 

#include "exception.hpp" 

#ifdef DEPRECATED_LYNX 
namespace util 
{ 
    DECLARE_EXCEPTION(_Failure) 
} 
#define _failure util::_Failure 

#else 
#define _failure std::ifstream::failure 
#endif // DEPRECATED_LYNX 

#endif // __COMPATIBLE 

這是我coresponding CPP文件:

#include "compatible.h" 

#ifdef DEPRECATED_LYNX 
DEFINE_EXCEPTION(util, _Failure) 
#endif 

由於我是新手,這只是一種變通方法,我現在需要手動拋出異常,所以我包裝了fstream。在badbit,failbit和eofbit上拋出異常。我不知道它有多好。