Застрял между устаревшей библиотекой ввода-вывода C ++ и стандартизированной библиотекой ввода-вывода - PullRequest
4 голосов
/ 24 октября 2011

У меня вопрос после разочарования, на самом деле я недавно изучал стандартную библиотеку ввода-вывода C ++.Я разработал на машине Linux, так что все было хорошо.Так как я использовал обработку исключений для файла io (file.exceptions (flags))), который не поддерживается более старой версией компилятора GNU C ++.Фактическая машина развертывания имеет очень старую версию g ++, вероятно, 2.9x.Я пишу приложение для записи данных, так как написал много кода, опираясь на пару try-catch.Что мне теперь делать.Я попытался объявить исключение, унаследованное от std :: exception.Оно работает.Это хорошая идея, чтобы обернуть fstream в заголовочный файл.Если да, то как мне это сделать, например наследовать или просто обернуть?

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Поскольку вы уже используете linux & gcc, возможно, стоит начать использовать автоинструменты GNU.Решение проблем переносимости этого типа является одной из основных целей автоинструментов.

Автоинструменты создадут файл с именем config.h с набором #defines, который указывает на наличие или отсутствие определенных функций в вашемсреда.(В этом случае AC_CXX_EXCEPTIONS, скорее всего, необходимая проверка.) Затем вы можете использовать теги #ifdef, чтобы препроцессор исключал код, который вы написали специально для совместимости со старым компилятором, всякий раз, когда скрипт configure считает, что они не нужны.

Первый раз, когда вы используете автоинструментальные средства, это немного сложная кривая обучения, но это одноразовые затраты времени.Они сделают каждый будущий проект намного проще в настройке.Вы также можете проверить, поддерживает ли ваша целевая машина автоинструменты, и если да, то какая версия инструментов поддерживается.

0 голосов
/ 25 октября 2011

Это мой обходной путь, файл compatibility.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. Я не знаю, насколько это хорошо.

...