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