0

我正在尝试制作一个查找表。这是借口:

假设,以下是某些宏的定义列表。

#define ENTITY1 0x10001001
#define ENTITY2 0x10001002
.
.
.

ENTITY_ 是其他无符号长整数类型值的用户可读字符串值,并且可以有任意数量的宏(比如大于 200,甚至 500)。

现在,有一个列表可以跟踪哪个实体存在于哪个文件编号中。像这样的东西:

 0x10001001 1
 0x10001002 2
 0x10001003 3
 .
 .
 .

由于专有约定,必须为每个实体使用长无符号整数。

第一个列表已经存在,第二个列表需要通过程序在用户输入记录时使用第一个列表的#defines 中的宏字符串生成。由于此类条目的数量非常多,因此对每个值进行硬编码是一项繁重的任务。此外,如果第一个列表被更新,如果没有编码额外的 switch case,第二个列表将不会正确更新。

当用户输入一个条目时,他通过一个字符串变量告诉该条目将在 ENTITY3 中输入,系统应该查找名称为 ENTITY3 的宏是否存在。如果是,则打开编号为 3 的文件并进行必要的处理,否则,显示该条目不存在的警告。

那么,如何在不使用 SWITCH CASE 的情况下将用户输入的字符串变量与宏名称进行比较?

我正在使用 C 编程。GNU C 库。


编辑:这是场景。

名为 ENTITYn 的不同实体(n 可以是任意数字)可以存在于具有特定整数 1、2、3 的不同文件中......但是,专有环境已经建立了这些实体,以便使用某些无符号长识别它们整数,如 0x01001001 等。对于每个实体,宏已在与这些实体对应的一些头文件中定义,名称为 ENTITY1 ENTITY2... 现在,当某个经理想要更改某些内容或向特定实体输入某些数据时,他将使用名称 ENTITYn 来寻址,并且程序将在查找表中查找相应的条目。如果找到匹配项,它将使用该实体的无符号长整数代码进行专有系统内部的后续处理,

我需要用实体的无符号长整数及其对应位置填充第二个表(现在让它们都在一个文件 1 中)。我想规避这样的条件,即制作 LUT 的人必须知道相应的实体无符号长整数代码。该程序使用输入字符串即ENTITY1 并直接对其进行映射。

但现在我开始认为对 LUT 进行硬编码会是更好的选择。:)

4

3 回答 3

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

,您可以使用它来查找字符串文字。

于 2012-05-15T10:06:28.697 回答
0

那么,如何将用户输入的字符串变量与宏名称进行比较呢?

你不能。宏仅在编译时存在(从技术上讲,仅在预处理时存在,这发生在编译时之前)。

在确定我正确理解您的情况之前,我不会提出解决方案(请参阅上面的评论)。

于 2012-05-15T10:04:32.657 回答
0

宏是预处理器功能,它们对 C 编译器不可见。所以你不能直接从代码中引用宏的“值”。

如果我正确理解,您似乎需要两个查找表:

  1. 一个表将字符串(例如ENTITY1to)映射到唯一的无符号整数,例如0x10001001.
  2. 一个表将一个无符号整数映射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结构中。

于 2012-05-15T10:06:33.427 回答