我正在尝试查找表格。这是借口:
假设,以下是某些宏的定义列表。
#define ENTITY1 0x10001001
#define ENTITY2 0x10001002
.
.
.
ENTITY_是无符号长整数类型值的用户可读字符串值,可以有任意数量的宏(例如大于200,甚至500)。
现在,有一个列表可以跟踪哪个实体存在于哪个文件编号中。像这样:
0x10001001 1
0x10001002 2
0x10001003 3
.
.
.
由于专有惯例,必须使用每个ENTITY的长无符号整数。
第一个列表已经存在,第二个列表需要通过程序在用户输入记录时使用第一个列表的#defines中的宏字符串生成。 由于这些条目的数量非常大,因此对每个值进行硬编码是一项繁重的任务。此外,如果更新第一个列表,则如果未编码其他开关案例,则第二个列表将无法正确更新。
当用户输入一个条目时,他告诉该条目是通过一个字符串变量在ENTITY3中进行的,系统应该查找名称为ENTITY3的宏是否存在。如果是,则打开编号为3的文件并进行必要的处理,否则,显示不存在此类条目的警告。
那么,如何在不使用SWITCH CASE的情况下将用户输入的字符串变量与宏名称进行比较?
我正在使用C编程。 GNU C Library。
编辑:这是方案。
名为ENTITYn的不同实体(n可以是任意数字)可以存在于具有特定整数1,2,3的不同文件中... 但是,专有环境构建了这些实体,以便使用某些无符号长整数(如0x01001001等)识别它们。对于每个实体,宏已在某些头文件中定义,这些头文件对应于名称为ENTITY1 ENTITY2的那些实体... 现在,当某个经理想要改变某些东西,或者将特定数据输入某个特定实体时,他将通过名称ENTITYn进行寻址,并且该程序将在查找表中查找相应的条目。如果找到匹配,它将使用该实体的无符号长整数代码用于专有系统内部的后续处理,访问另一个查找表,该查找表查找具有此条目的文件号并打开该文件位置以进行处理。
我需要使用实体的无符号长整数及其相应位置填充第二个表(现在让它们全部放在单个文件1中)。我想绕过条件,那个使LUT必须知道相应实体无符号长整数代码的条件。该程序使用输入字符串,即ENTITY1并直接映射它。
但是现在我开始认为对LUT进行硬编码会是更好的选择。 :)
答案 0 :(得分:1)
C程序中不存在宏名称。预处理器已将替换值替换为宏名称的每个实例。如果我正确理解您的问题,您可能需要某种查找表,例如:
#define ENTITY1 0x10001001
#define ENTITY2 0x10001002
#define STR(x) #x
struct lookup { char *name; unsigned value; } ;
struct lookup mylut[] = {
{ STR(ENTITY1), ENTITY1 }
, { STR(ENTITY2), ENTITY2 }
};
预处理器会将其扩展为:
struct lookup { char *name; unsigned value; } ;
struct lookup mylut[] = {
{ "ENTITY1", 0x10001001 }
, { "ENTITY2", 0x10001002 }
};
,您可以使用它来查找字符串文字。
答案 1 :(得分:0)
那么,如何将用户输入的字符串变量与宏名称进行比较?
你做不到。宏仅在编译时存在(技术上,仅在预处理时,在编译时发生)。
在我确定我的情况正确理解之前,我不打算提出解决方案(请参阅上面的评论)。
答案 2 :(得分:0)
宏是预处理器功能,它们对C编译器不可见。所以你不能直接从代码中引用宏的“值”。
如果我能正确理解,你似乎需要两个查找表:
ENTITY1
等字符串映射到唯一的无符号整数,例如0x10001001
。0x10001001
)映射到“文件编号”,看起来像(小)无符号整数,例如1
。这两个表都可以通过处理您似乎拥有的源代码来生成。我建议将ENTITYn
字符串收集到这样的内容中:
struct entity_info
{
const char *name;
unsigned int key;
};
然后让您的预处理代码构建这些的排序数组:
const struct entity_info entities[] = {
{ "ENTITY1", 0x10001001 },
{ "ENTITY2", 0x10001002 },
/* and so on */
};
现在你可以实现这样一个有效的功能:
unsigned int get_entity_key(const char *entity_name);
它可能在内部使用二进制搜索。
显然,你需要做第二步。我不确定这些值的确切细节(它们如何以及何时可以改变);如果给定实体的“文件编号”是常量,则它当然可以直接添加到entity_info
结构中。