Ах включен в BH, и я включаю BH в свой исходный файл, мне нужно также включить Ах в моем исходном файле?
Я рассматриваю пример из книги на С ++. И не поняла определенного случая.
Файл main.cpp включает stdexcept.h для использования исключения во время выполнения. А также включает ErrorHandlingModule.h.
ErrorHandlingModule.h уже включает stdexcept.h из-за параметра ошибки времени выполнения, который он содержит в прототипе функции.
В книге сказано, что я должен включить stdexcept.h также в main.cpp. В исходном коде книги также написано так.
Когда я удаляю sdtexcept.h из main.cpp, компиляция проходит очень хорошо, и программа все еще работает нормально.
Но почему в книге так сказано?
Спасибо за любые ответы.
main.cpp:
#include <iostream>
#include <stdexcept>
#include "ErrorHandlingModule.h"
#include "Prompt.h"
// ....
int main(int argc, char* argv[])
{
SAMSErrorHandlingModule::initialize();
do
{
try
{
char Operator = getOperator();
float Operand = getOperand();
cout << Accumulate( Operator, Operand ) << endl;
}
catch( runtime_error RuntimeError )
{
SAMSErrorHandlingModule::handleRuntimeError(RuntimeError);
}
catch(...)
{
SAMSErrorHandlingModule::handleNotaNumberError();
};
}while (SAMSPrompt::UserWantsToContinueYorN("More?"));
return 0;
}
ERRORHANDLINGMODULE.H
#include <stdexcept>
#ifndef _ERROR_HANDLING_MODULE_H
#define _ERROR_HANDLING_MODULE_H
namespace SAMSErrorHandlingModule
{
using namespace std;
void initialize( void );
int handleNotaNumberError( void );
int handleRuntimeError( runtime_error theRuntimeError );
}
#endif // _ERROR_HANDLING_MODULE_H
2 ответа
Я думаю, что причина в обслуживании. По крайней мере, я бы сделал это по этой причине. Если вы в конечном итоге решите переключиться на "ErrorHandlingModule.h" на что-то другое (например, вы реализуете лучшую стратегию обработки ошибок и хотите использовать новую), вы не захотите, чтобы другой код в main ломался из-за этого.
Это означает, что если вы используете что-то из stdexcept в своей основной базе данных, кроме использования для ввода / вывода из ErrorHandlingModule, вы должны включить это. В противном случае я бы не включил его, так как он не нужен, когда ErrorHandlingModule не используется.
Как вы заметили, это не имеет ничего общего с компиляцией, поскольку ваша программа компилируется просто отлично, если вы не включаете ее в основную. При этом, однако, обратите внимание, что даже если он компилируется, он не всегда "семантически" корректен. Фактически, ваш код может скомпилироваться, даже если вы удалите включение из "ErrorHandlingModule.h" (поскольку stdexcept включен до включения ErrorHandlingModule.h). По этой причине я всегда предпочитаю включать "..." перед <...>.
Также проверьте этот вопрос для аналогичного обсуждения.
Нет, вам не нужно #include для stdexcept в обоих файлах. Препроцессор скопирует заголовочный файл в файл c перед запуском через компилятор C. Многократное включение одного и того же заголовочного файла может быть очень проблематичным, поэтому пример кода использует #ifndef для создаваемого вами заголовочного файла, чтобы убедиться, что код заголовка включается только один раз. Однако, как сказал Стефано, если вы больше не включаете stdexcept, а затем прекращаете использовать заголовочный файл ERRORHANDLINGMODULE, ваш код больше не будет компилироваться.