gpt4 book ai didi

c++ - 对于静态错误字符串,哪个内存/性能效率更高,或者有其他选择吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:54 24 4
gpt4 key购买 nike

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

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

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

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

谢谢

最佳答案

这里有几件事很紧张,让我列举一下:

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

一般来说,我见过的最简单的事情是使用一些整数常量来识别错误,然后在旁边有一个表格,您可以在其中检索其他信息(可能有很多)。例如,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

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

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

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

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

关于c++ - 对于静态错误字符串,哪个内存/性能效率更高,或者有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10767511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com