2012-05-15 299 views
0

我正在尝试查看表格。这是借口:将用户输入字符串与MACRO名称进行比较

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

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

的ENTITY_是否则无符号长整数型值的用户可读的字符串值,并且可以存在任何数量的宏(说大于200或甚至500)。

现在,有一个列表可以跟踪哪个实体存在于哪个文件编号中。例如:

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

由于专有约定,每个ENTITY使用长无符号整数是必需的。

第一个列表已经存在,第二个列表需要在用户输入记录时通过使用第一个列表的#define中的宏字符串通过程序生成。由于这些条目的数量非常大,因此对每个值进行硬编码是一项繁重的任务。另外,如果更新第一个列表,如果没有编码额外的开关情况,第二个列表将不会适当更新。

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

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

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


编辑:这是场景。

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

我需要使用实体的无符号长整型和它们相应的位置(让所有实体现在处于单个文件1中)填充此第二个表。我想规避这种情况,即使那个LUT必须知道相应的实体无符号长整数代码。该程序使用输入字符串即ENTITY1并直接映射它。

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

+0

我已经为您的问题写了一个初步的答案,但我没有完全理解您的方案。你是否试图在运行时将一个字符串(例如“ENTITY1”)映射为一个整数(0x10001001)? –

回答

0

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

这似乎需要两个查找表,如果我得到这个正确:

  1. 一个表映射一个字符串,如ENTITY1到一个独特的无符号整数,如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结构中。

+0

是的,我需要两个查找表,但我不想手动填充这两个表。 – Anshul

+0

@Anshul当我在列表后面说“处理源代码”时,我试图解释说您需要一些程序从源代码中提取这些信息,并建立表格。 – unwind

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

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

相关问题