a.h包含在b.h中,我在源文件中包含b.h,我是否还需要在源文件中包含a.h?

时间:2013-07-15 13:26:18

标签: header-files

我正在阅读一本c ++书中的例子。并且不了解某个案例。

main.cpp包含stdexcept.h以使用运行时异常。还包括ErrorHandlingModule.h。

ErrorHandlingModule.h已经包含了stdexcept.h,因为它在函数原型中有运行时错误参数。

这本书说我必须在main.cpp中包含stdexcept.h。在本书的源代码中,它也是这样编写的。

当我从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

2 个答案:

答案 0 :(得分:0)

我认为原因是维持。至少,我会这样做。如果你最终决定切换到“ErrorHandlingModule.h”到其他东西(例如你实现了一个更好的错误处理策略并想要使用新的错误处理策略)你不希望其他代码成为main因此而破坏。

这意味着如果您在main中使用stdexcept中的某些内容,除了使用它来输入/输出ErrorHandlingModule之外,您还应该包含它。否则,我不会包含它,因为在不使用ErrorHandlingModule时不需要它。

正如您所指出的,这与编译无关,因为如果您不将其包含在主程序中,您的程序编译就可以了。但是,在这方面,请注意,即使它编译,也不总是“语义上”正确。实际上,即使从“ErrorHandlingModule.h”中删除了包含,您的代码也可能编译(因为在包含ErrorHandlingModule.h之前包含了stdexcept)。这就是为什么我总是喜欢在&lt; ...&gt;之前使用“...”。的。

同时检查this问题以进行类似的讨论。

答案 1 :(得分:0)

不,在两个文件中都不需要#include for stdexcept。预处理器将在通过C编译器运行之前将头文件复制到c文件中。多个包含相同头文件可能非常有问题,这就是为什么示例代码将#ifndef用于您正在创建的头文件以确保头代码仅包含一次。就像Stefano所说,如果你不再包含stdexcept,然后停止使用ERRORHANDLINGMODULE头文件,你的代码将不再编译。