在C中存储常量数据的最佳方法

时间:2017-06-29 19:37:20

标签: c string

假设我正在制作一个C程序,当用户输入宝石的名字时,该程序会显示有关宝石的信息。

石头名称永远不会改变,并且只有不到20个,所以在运行时从外部文件读取它们似乎有点矫枉过正。

我还需要从多个文件中访问这些名称(比方说两个)。

我通常做的是声明一个像这样的全局char *数组:

char *g_rsc_names[] = {"linemate", "deraumere", "sibur", "mendiane", "phiras", "thystane"};  

在文件中我需要使用它们。这看起来很好,但这只允许我访问我声明这个全局数组的文件中的名称。

在这种情况下,存储宝石名称的最佳/最干净的方法是什么?

3 个答案:

答案 0 :(得分:6)

您可以使用一个函数来包装数组,该函数将const char*返回到相应的石头名称,并将该声明放入您包含在多个文件中的全局头文件中:

const char* get_stone_name(size_t id);

源文件中定义get_stone_name,如:

const char* get_stone_name(size_t id) {
    static const char* const names[] = {
        "linemate", "deraumere", "sibur", "mendiane", "phiras", "thystane"
    };
    return (id < (sizeof(names) / sizeof(names[0])) ? names[id] : "");
}

names定义为static将保证不会多次初始化,并且作为副选项,您可以阻止用户将数组索引越界。

答案 1 :(得分:0)

为每块石头定义一个带有符号名称的枚举。然后,您将枚举值存储在文件中而不是名称中。

然后,您可以定义一个函数,该函数将返回给定枚举的关联字符串。

enum stones {
    STONE_LINEMATE,
    STONE_DERAMERE,
    ...
};

const char *stone_name(int stone)
{
    switch (stone) {
    case STONE_LINEMATE:
        return "linemate";
    case STONE_DERAMERE:
        return "deraumere";
    ...
    default:
        return "";
}

答案 2 :(得分:0)

将石头数据类型的公开声明放在标题文件中,例如stones.h

// This lets any file that includes stones.h know that you've defined 
// a variable named g_rsc_names.
extern char const *const g_rsc_names[];

该变量被定义为一个包含一些字符(字符串)指针的数组,这些指针永远不会改变,每个指向永远不会改变的字符(字符串)。这是为了防止程序员错误,并为编译器提供一些优化提示。

然后,在另一个文件stones.c

// Populate the array.
char const *const g_rsc_names[] = {
    "linemate", "deraumere", "sibur", "mendiane", "phiras", "thystane" 
};  

现在,在您想要引用数组的任何位置包含stones.h。确保编译stones.c文件并将其链接到二进制文件。