#c #exception-handling #fstream
#c #обработка исключений #поток fstream
Вопрос:
Мой вопрос после разочарования, на самом деле я недавно изучил стандартную библиотеку ввода-вывода C . Я разрабатывал на компьютере с Linux, так что все было в порядке. Поскольку я использовал обработку исключений для ввода-вывода файлов (file.exceptions(flags))), которая не поддерживается более старой версией компилятора GNU C . Фактическая машина развертывания имеет очень старую версию g , вероятно, 2.9x что-то. Я пишу приложение для записи данных, поскольку я написал много кода, полагаясь на пару try-catch. Что мне теперь делать. Я попытался объявить исключение, унаследованное от std::exception . Это работает. Хорошая ли идея обернуть fstream в заголовочный файл? Если да, то как мне это сделать, например, наследовать или просто обернуть?
Комментарии:
1. В чем причина того, что вы не отдаете предпочтение этому старому компилятору перед более новыми версиями?
2. Тот же вопрос, что и @Nawaz: почему бы не перейти на более новую версию g ?
3. У нас было оборудование, связанное с этой машиной, несколько видеотек, некоторое аналоговое оборудование и тому подобное. Аппаратное обеспечение несовместимо с другими ОС AFAIK.
4. Может быть, даже стоит попробовать скомпилировать новый GCC в этом поле
5. @LaurynasBiveinis пробовал это, виртуальная память исчерпана, у нас очень ограниченные ресурсы. Я признаю, что мне не следовало писать такой код, но я ученик.
Ответ №1:
Поскольку вы уже используете linux и gcc, возможно, было бы неплохо начать использовать GNU autotools. Решение проблем переносимости такого типа является одной из основных целей autotools.
Autotools сгенерирует файл с именем config.h с набором #defines, который указывает на наличие или отсутствие определенных функций в вашей среде. (В данном случае, AC_CXX_EXCEPTIONS
скорее всего, это тот чек, который вам нужен.) Затем вы можете использовать теги #ifdef, чтобы препроцессор исключал код, который вы написали специально для совместимости со старым компилятором, всякий раз, когда сценарий configure видит, что они не нужны.
Первый раз, когда вы используете autotools, это немного сложная кривая обучения, но это единовременные затраты времени. Они значительно упростят настройку каждого будущего проекта, за который вы возьметесь. Вы также захотите проверить, поддерживает ли ваша целевая машина autotools, и если да, то какая версия инструментов поддерживается.
Комментарии:
1. Да, цель поддерживает autotools, я могу найти обходной путь здесь, но еще не протестировал его на цели. Я отправляю это как ответ. Исключения есть, но они не относятся к библиотеке потоков ввода-вывода.
Ответ №2:
Это мой обходной путь, совместимый файл.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. Я не знаю, насколько это хорошо.