13

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

通过“全局”,我的意思是:可从包含标题的任何文件中使用。但不是某些运行时创建的单点对象的一部分。

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

通过“字符串”,我的意思是:空终止的字符数组很好。std::string 会很好,但我认为不能按照上述方式完成。正确的?

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

通过“C++”,我的意思是:C++ 不是 C。(更新:C++98,不是 C++11)

4

4 回答 4

10

字符串.h

extern const char* table[];

字符串.cpp

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

另一种方法是使用查找表的错误代码:

错误.h

#define ERR_NOT_FOUND    0x1004
#define ERR_INVALID      0x1005

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

错误.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;
}

主文件

#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 程序员。

于 2013-01-08T04:58:44.437 回答
6

使用std::array字符串文字。它没有构造函数,因此它将.rodata像 C 数组一样静态加载到该部分中,但它具有标准的 C++ 库接口。(迭代器、大小等)

#include <array>

extern std::array<const char*, 3> A;

A.cpp

std::array<const char*, 3> A = { "foo", "bar", "baz" };

http://en.cppreference.com/w/cpp/container/array

于 2013-01-08T04:58:24.827 回答
4

我喜欢 Jonathon Reinhart 的方式,我总是这样做,特别是如果我们有元素结构,

但是,它需要一个循环来查找元素(未索引),因此如果您喜欢改进,尤其是对于嵌入式系统样式。

enum ERR_INDEX{
ERR_NOT_FOUND=0,
ERR_INVALID,
ERR_BAD_LENGTH,
ERR_MORE_ERR1,
ERR_MORE_ERR2,
ERR_MORE_ERR3,
};

static const char * errmsg_table[] = {
    "Not found",
    "Invalid",
    "bad message length",
    "error 1",
    "error 2",
    "error 3",
};

int main(int argc, char** argv) {
    int code = ERR_INVALID;
    printf("%d: %s\n", code, errmsg_table[code]);
    printf("%d: %s\n", code, errmsg_table[ERR_BAD_LENGTH]);

return 0;
}
于 2013-05-03T18:42:57.797 回答
3

严格提供table_n以确保您至少知道它有多大:

表.h

// header file
extern const size_t table_n;
extern const char* table[];

表.cpp

// c/cpp file
const char *table[] = 
{
     "one",
     "two",
     "there"
};

const size_t table_n = sizeof(table)/sizeof(table[0]);

或类似的东西。

于 2013-01-08T05:04:06.790 回答