对于静态错误字符串,哪个内存/性能更高,或者有替代方案?

时间:2012-05-26 15:31:34

标签: c++ c

我想知道在C ++中处理静态错误字符串的最佳方法是什么。我目前正在使用一些常量的char指针,但它们变得笨拙,并且它们散布在我的代码中的每个位置。我也应该为这些字符串使用静态常量字符指针吗?

我正在考虑使用SimpleIni类进行跨平台兼容性的定义,哈希表和INI文件。该项目是一个始终运行的Web服务器。

我想使用错误号或名称来逻辑地引用它们。

如果有帮助的话,我正在使用命名空间类中包含的全局空间和方法。如果有帮助,代码将导出到C环境。

由于

4 个答案:

答案 0 :(得分:2)

首先,您可以在stackoverflow上查看其他相关问题。在这里你有一些:

然后看一下关于错误处理的这个伟大的tutorial(这是一个五部分教程,但你可以从该链接访问所有这些)。如果您使用的是C ++ 11,这一点尤为有趣,因为它提供了许多错误处理功能。或者,如果您不能使用C ++ 11,则可以使用boost

您还需要考虑是否要包含对本地化的支持。如果您的应用程序可能以不同语言向用户显示消息,那么最好从错误管理的一开始就包含该要求。例如,您可以检查Boost.Locale

答案 1 :(得分:2)

这里有几件紧张的事情,所以请让我列举一下:

  • 集中化/模块化:考虑集中化事物是正常的,因为它可以轻松检查人们应该预期的错误类型,并从大致的纪念品等中恢复错误......但模块化要求每个模块都能够介绍其新错误
  • 错误可能发生在动态初始化期间(除非你禁止运行代码,不容易检查),以规避生命周期问题,最好只依赖于在静态初始化期间初始化的对象(这种情况就是这样)对于字符串文字,例如)

一般来说,我看到的最简单的事情是使用一些整数常量来识别错误,然后在一侧有一个表,您可以在其中检索其他信息(可能很多)。例如,Clang使用该系统进行诊断。您可以通过使用预处理器来避免重复自己。

使用这样的标题:

#define MYMODULE_ERROR_LIST     \
     ERROR(Code, "description") \
     ...

#define ERROR(Code, Desc) Code,

class enum ErrorCode: unsigned {
    MYMODULE_ERROR_List
    NumberOfElements
};

#undef ERROR

struct Error {
    ErrorCode code;
    char const* description;
};

Error const& error(ErrorCode ec);

一个简单的源文件来定位数组:

#define ERROR(Code, Desc) { Code, Desc },

Error const ErrorsArray[] = {
    MYMODULE_ERROR_LIST
    {ErrorCode::NumberOfElements, 0}
};

Error const& error(ErrorCode const ec) {
    assert(unsigned(ec) < unsigned(ErrorCode::NumberOfElements) &&
           "The error code must have been corrupted.");
    return ErrorsArray[ec];
} // error

注意:在标题中定义宏的代价是,描述中措辞的最轻微改变意味着根据枚举重新编译所有代码。就个人而言,我的东西构建速度比测试时快得多,所以我并不在乎。

这是一个非常有效的方案。因为它尊重DRY(不要重复自己),它还确保代码描述映射是准确的。可以调整ERROR宏以获得更多信息,而不仅仅是描述(类别等)。只要Error类型is_trivially_constructible,就可以静态初始化数组,从而避免生命周期问题。

不幸的是,enum在模块化方面不是很好;并且让每个模块运行自己的enum在处理错误时很快就会变得无聊(Error结构可以使用unsigned code;)。

如果您希望超越中央存储库,则需要更多涉及的机制,但由于它似乎适合您,我将停止提及此限制。

答案 2 :(得分:1)

我会在标题中保持简单:

enum ErrorCode { E_help, E_wtf, E_uhoh };
const char* errstr(ErrorCode);

然后在一些.c.cc文件中:

const char* error_strings[] = {
  "help!",
  "wtf?",
  "uh-oh"
};
const char* errstr(ErrorCode e) { return error_strings[e]; }

答案 3 :(得分:-1)

在您的问题中没有太多细节,但是根据您发布的内容,我会考虑使用单例类来处理您的错误消息。您可以创建按代码或枚举访问消息的方法。然后,您可以实现国际化或您的特定应用所需的任何其他内容。此外,如果您决定在将来使用SQLite或其他基于文件的解决方案,则类接口可以保持不变(或扩展),从而最大限度地减少对其余代码的影响。