c++ - 静态字符串文字表?

标签 c++ string static readonly string-table

在 C++ 中创建全局和静态字符串表的正确方法是什么?

“全局”是指:可用于包含标题的任何文件。但不是某些运行时创建的单对象对象的一部分。

“静态”是指:尽可能少的运行时间设置。只读存储器页中的数据。每个应用只有 1 个数据实例。

“字符串”是指:以空字符结尾的字符数组很好。 std::string 会很好,但我认为不能按照上述方式完成。对吗?

“表”是指:我的意思是一个可索引的数组。所以我想这不是一张 table 本身。但我在这一点上很灵活。开放的想法。

“C++”是指:C++ 不是 C。(更新:C++98,不是 C++11)

最佳答案

strings.h

extern const char* table[];

strings.cpp

const char* table[] = {
    "Stack",
    "Overflow",
}

对此的另一种看法,使用查找表的错误代码:

err.h

#define ERR_NOT_FOUND    0x1004
#define ERR_INVALID      0x1005

bool get_err_msg(int code, const char* &msg);

err.cpp

typedef struct {
    int errcode;
    const char* msg;
} errmsg_t;

static errmsg_t errmsg_table[] = {
    {ERR_NOT_FOUND, "Not found"},
    {ERR_INVALID,   "Invalid"}
};

#define ERRMSG_TABLE_LEN  sizeof(errmsg_table)/sizeof(errmsg_table[0])

bool get_err_msg(int code, const char* &msg){
    msg = NULL;
    for (int i=0; i<ERRMSG_TABLE_LEN; i++) {
        if (errmsg_table[i].errcode == code) {
            msg = errmsg_table[i].msg;
            return true;
        }
    }
    return false;
}

ma​​in.cpp

#include <stdio.h>
#include "err.h"

int main(int argc, char** argv) {
    const char* msg;
    int code = ERR_INVALID;
    if (get_err_msg(code, msg)) {
        printf("%d: %s\n", code, msg);
    }
    return 0;
}

我确信有更多的 C++ 方法可以做到这一点,但我确实是一名 C 程序员。

关于c++ - 静态字符串文字表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14208412/

相关文章:

c++ - 使用动态规划改变的所有解决方案

java - 在简单单例实例化中获取 ExceptionInInitializerError

java - 为什么要使用new创建String对象

c++ - 与模板方法不一致的字符串排序

C - 将 2 个 2D 字符串数组组合并更改为更大的 2D 数组的最简单方法

c++ - 实例 C++ 的静态集合?

来自其他 bean 的 JSF Bean 属性

c++ - 如何将 OpenCV 窗口设置为点击窗口?

c++ - 为什么在 C++ 中使用 cin、cout 或 %I64d 优于 %lld 说明符?

c++ - 如何从 OpenCV 中的目录中按顺序读取文件?