假设我正在制作一个C程序,当用户输入宝石的名字时,该程序会显示有关宝石的信息。
石头名称永远不会改变,并且只有不到20个,所以在运行时从外部文件读取它们似乎有点矫枉过正。
我还需要从多个文件中访问这些名称(比方说两个)。
我通常做的是声明一个像这样的全局char *数组:
char *g_rsc_names[] = {"linemate", "deraumere", "sibur", "mendiane", "phiras", "thystane"};
在文件中我需要使用它们。这看起来很好,但这只允许我访问我声明这个全局数组的文件中的名称。
在这种情况下,存储宝石名称的最佳/最干净的方法是什么?
答案 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
文件并将其链接到二进制文件。