2013-07-15 107 views
2

我正在通过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 

回答

0

我认为原因是维修。至少,我会这样做。如果您最终决定切换到“ErrorHandlingModule.h”(例如,您实施了更好的错误处理策略并希望使用新的错误处理策略),则不希望其他代码因为此而中断。

这意味着,如果你使用的是在主从stdexcept东西,除了用它输入从ErrorHandlingModule /输出,你应该包括它。否则,我不会包含它,因为不使用ErrorHandlingModule时不需要它。

正如你提到的,这有什么好做的编译,因为你的程序编译就好了,如果你不包括它进入主。但是,在这方面,请注意,即使它编译,它也不总是“语义上”正确的。实际上,即使您从“ErrorHandlingModule.h”中删除包含(因为在包含ErrorHandlingModule.h之前包含stdexcept),您的代码也可能会编译。这就是为什么我总是更喜欢在......之前包含“...”包括...之前的原因。

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

+0

当我从ErrorHandling Module.h中删除包含时,它不会编译。但你是对的。如果我需要使用更好的将来不使用sdtexcept的错误处理模块。主要还有其他一些用途,我需要包括它。 –

+0

如果这是您所期待的答案,请将其标记为您的问题的答案。谢谢! –

+0

感谢您的回答。 –

0

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

+0

感谢您的回答@Lianne –