0

最近我一直在认真研究我的编程风格以及如何改进它。首先让我说,在我目前的角色中,我是唯一的程序员。结果,我可以随心所欲地把事情弄得乱七八糟,但我真的在努力成为一个更好、更健全的程序员。

此外,我的背景主要是基于 C 的,必要时基本上使用 C++ 作为 C 的超集。结果,我偶然发现了以下难题。

我总是用类似 #define ERROR_FUNCTION_BLEW_UP -2 的东西定义错误代码。老实说,我可以看到这样做的好处,因为我不必分配内存来存储 -2。但是,在 C++ 中,我可以看到使用 const 变量的好处,因为两个竞争宏之间发生冲突的可能性较小。

结果,我想知道在 C++ 中实现错误代码最简洁的方法是什么。也就是说,我希望客户端能够通过执行类似于“if (return_value == ERROR_FUNCTION_BLEW_UP)”的操作来检查某些函数的返回值。我尝试在每个类中添加一个 const 变量,但是代码看起来不正确。也就是说,客户端现在检查“if (return_value == MyClass.kErrorFunctionBlewUp_)”的内容。有没有一种更简洁的方法来实现这一点,而不是让常量成为类的公共成员?

另外,补充一下我的问题,myClass 是一个基类,现在我想在 MyDerivedClass 中添加更多错误代码。解决此问题并避免使用宏的最佳方法是什么?

谢谢大家的帮助。

4

2 回答 2

6

使用enums:

enum Errors
{
    NO_ERROR = 0,
    FUNCTION_BLEW_UP,
    WTF_THIS_SHOULDNT_HAPPEN,
};

std::exception此外,如果它们更合适,请考虑使用异常(查看)。

于 2013-06-08T01:52:17.397 回答
0

如果您真的只想替换宏,请将它们替换为常量。常量具有内部链接(即仅限于翻译单元(“文件”)),因此编译器可以轻松地用常量内联替换它们的使用,而无需使用比宏更多或更少的单个字节。请注意,习惯上将 ALL_UPPERCASE 保留为宏,因为宏不遵循正常的代码约定,因此您也必须更改它。

然后,在 C++ 中,您通常不使用调用者必须检查的返回码,而是使用自动传播的异常。如果要保留错误代码,可以使用枚举或常量并将它们放入命名空间。请注意,枚举会泄漏到周围的命名空间或类中,这使得最好将它们包装在一层:

namespace errorcode
{
    enum type
    {
        printer_on_fire,
        volume_not_formatted,
        bluescreen
    };
}

异常有时确实包含错误代码,这些代码进一步指定了失败的原因。这是指定它们的一种方法:

struct error:
    std::runtime_error
{
    ...

    enum code
    {
        printer_on_fire,
        volume_not_formatted,
        bluescreen
    };

    code fault;
};

请注意,您不必嵌套代码,您也可以使用errorcode::type上面现有的构建异常类型。不过,一些嵌套很有用,因为枚举会污染周围的命名空间。

也就是说,您问“我是否在上课前将其放在文件的顶部”,但在这里您有一个误解。首先,并非每个文件都包含一个类。然后,并非每个包含类的文件都包含其中一个。例如,如果错误代码的集合被整个类层次结构使用,那么在单独的文件中定义它是有意义的,以明确它不属于其中一个,并且可以在相关的非类中使用功能,也是。在该文件中,您还可以粘贴例如将其转换为字符串以进行调试的函数,以及可能带有其中之一的异常类型。

于 2013-06-08T08:11:39.710 回答