2

我正在阅读一本 C++ 书中的示例。并且不明白某个案例。

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

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

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

当我从 main.cpp 中删除 sdtexcept.h 时,编译通过就好了,程序仍然可以正常工作。

但是为什么书上这么说呢?

感谢您的任何回答。

主.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;
}

错误处理模块.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
4

2 回答 2

0

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

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

正如您所指出的,这与编译无关,因为如果您不将其包含在 main.c 中,您的程序编译得很好。然而,在这方面,请注意即使它编译,它并不总是“语义”正确。事实上,即使您从“ErrorHandlingModule.h”中删除包含,您的代码也可能编译(因为在包含 ErrorHandlingModule.h 之前包含了 stdexcept)。这就是为什么我总是喜欢在 <...> 之前包含“...”的原因。

另请检查问题以进行类似的讨论。

于 2013-07-15T13:33:37.020 回答
0

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

于 2013-07-15T13:42:44.280 回答