a.h包含在b.h中,我在源文件中包含b.h,是否需要在源文件中包含a.h?
我正在通过C++书中的一个例子。并不了解某种情况。a.h包含在b.h中,我在源文件中包含b.h,是否需要在源文件中包含a.h?
main.cpp包含stdexcept.h以使用运行时异常。还包括ErrorHandlingModule.h。
ErrorHandlingModule.h已经包括了,因为它在函数原型在它运行时错误参数的stdexcept.h。
书上说我一定要还包括stdexcept.h在main.cpp中。在本书的源代码中,它也是这样写的。
当我删除的main.cpp编译sdtexcept.h通过就好了程序工作正常依旧。
但是为什么这本书说的那样?
感谢您的任何答案。
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
我认为原因是维修。至少,我会这样做。如果您最终决定切换到“ErrorHandlingModule.h”(例如,您实施了更好的错误处理策略并希望使用新的错误处理策略),则不希望其他代码因为此而中断。
这意味着,如果你使用的是在主从stdexcept东西,除了用它输入从ErrorHandlingModule /输出,你应该包括它。否则,我不会包含它,因为不使用ErrorHandlingModule时不需要它。
正如你提到的,这有什么好做的编译,因为你的程序编译就好了,如果你不包括它进入主。但是,在这方面,请注意,即使它编译,它也不总是“语义上”正确的。实际上,即使您从“ErrorHandlingModule.h”中删除包含(因为在包含ErrorHandlingModule.h之前包含stdexcept),您的代码也可能会编译。这就是为什么我总是更喜欢在......之前包含“...”包括...之前的原因。
同时检查this问题进行类似的讨论。
不,您不需要在两个文件中都包含stinccept的#include。预处理器将在运行C编译器之前将头文件复制到c文件中。多个包含相同的头文件可能会造成很大的问题,这就是为什么示例代码使用#ifndef作为您正在创建的头文件以确保头代码仅包含一次。就像Stefano说的那样,如果你不再包含stdexcept然后停止使用ERRORHANDLINGMODULE头文件,你的代码将不再编译。
感谢您的回答@Lianne –
当我从ErrorHandling Module.h中删除包含时,它不会编译。但你是对的。如果我需要使用更好的将来不使用sdtexcept的错误处理模块。主要还有其他一些用途,我需要包括它。 –
如果这是您所期待的答案,请将其标记为您的问题的答案。谢谢! –
感谢您的回答。 –