假设我正在制作一个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] : "");
}
取消names
static
将保证不会多次初始化,并且作为附带选项,您可以防止用户将数组索引越界。
定义一个枚举,为每个石头定义一个符号名称。 然后,您将枚举值而不是名称存储在文件中。
然后,您可以定义一个函数,该函数将返回给定枚举的关联字符串。
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
文件并将其链接到二进制文件。