陷入遗留C ++ IO库和标准化IO库之间

时间:2011-10-24 17:28:09

标签: c++ exception-handling fstream

我的问题是在经历了挫折之后,实际上我最近研究了标准的C ++ IO库。我是在Linux机器上开发的,所以一切都很好。因为我使用了文件io(file.exceptions(flags)))的异常处理,这是旧版GNU C ++编译器不支持的。实际的部署机器有很旧版本的g ++,可能是2.9倍。我正在编写一个数据记录器应用程序,因为我编写了大量依赖try-catch对的代码。我现在应该怎么做。我尝试声明从std :: exception继承的异常。有用。将fstream包装在头文件中是个好主意。如果是的话,我应该怎么做,比如继承,或者只是换行?

2 个答案:

答案 0 :(得分:1)

因为你正在使用linux& gcc已经开始使用GNU autotools了。解决这种类型的可移植性问题是autotools的核心目的之一。

autotools将生成一个名为config.h的文件,其中包含一组#defines,用于指示环境中是否存在某些功能。 (在这种情况下,AC_CXX_EXCEPTIONS可能是您想要的检查。)然后,您可以使用#ifdef标记让预处理器排除您专门为与旧编译器兼容而编写的代码,只要configure脚本看到它们不是必要的。

第一次使用autotools时学习曲线有点僵硬,但这是一次性的成本。它们将使您开展的每个未来项目更容易设置。您还需要检查目标计算机是否支持自动工具,如果支持,则支持哪个版本的工具。

答案 1 :(得分: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

这是我对应的cpp文件:

#include "compatible.h"

#ifdef DEPRECATED_LYNX
DEFINE_EXCEPTION(util, _Failure)
#endif

由于我是一个新手,这只是一个解决方法,我现在需要手动抛出异常,所以我包裹了fstream。在badbit,failbit和eofbit上抛出异常。我不知道它有多好。