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



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

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

我还需要从多个文件(假设两个(访问这些名称。

我通常做的是声明一个全局 char * 数组,如下所示:

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

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

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

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

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] : "");
}

取消namesstatic将保证不会多次初始化,并且作为附带选项,您可以防止用户将数组索引越界。

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

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

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 "";
}

在头文件中公开声明石头的数据类型,例如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文件并将其链接到二进制文件。

相关内容

最新更新