在C中,我想在运行时访问变量名。 例如,有一个结构abc
struct alpha
{
int aaa1,
int aaa2,
char bbb1
};
struct alpha alp;
char *ptr_alpha =&alp;
我可以使用任何表达式,如
if (alpha element1 name == "aaa1")
{
do this;
}
else
{
do that;
}
答案 0 :(得分:3)
在运行时访问变量名称没有任何意义。每个初学者都会在某个时刻得到这个想法,但这源于对“引擎盖下”的内容缺乏了解。标识符如变量名,函数名,类型等仅存在于源代码中。他们在那里帮助程序员。在编译的二进制文件中,没有任何标识符的痕迹。
您尝试实现的目标应该使用各种语言机制:枚举,指针,函数指针等。至于你的具体情况,关于你想要达到的目标的信息太少,提出如何解决它的建议。
答案 1 :(得分:2)
编译程序不知道标识符的名称(忽略dlsym magic),所以不,没有办法在运行时测试对某些struct成员的访问。但是如果你只需要根据某些字符串选择成员,那么
if (strcmp (user_input, "aaa1") == 0) {
/* do something to alp->aaa1 */
} else if (strcmp (user_input, "aaa2") == 0) {
/* do something to alp->aaa2 */
}
答案 2 :(得分:1)
如果你坚持下去,通常会有办法做任何事情。只是有时治愈比疾病更糟糕。
我过去曾经参与过这样做的合理理由,我们提出的最佳解决方案就是解析定义相关数据的头文件。
这不是一个容易解决的问题;解析标题时,您需要注意以下内容:变量名称,变量类型以及可能出现的任何填充。在解析每个元素时,会保存一个跟踪的偏移量,以便稍后获取名称时,将值填充为:(unsigned char *)(&data_structure + var_offset)
。
当您解析xml时,您将查找元素名称,并调用处理程序(您编写)以将数据放入您需要支持的每种类型的数据中。最常见的是,您可能需要int
处理程序和char *
(或其他)处理程序。用于实现简单定义的奖励点(通常作为数组大小的常量值(哦,是的,你必须实现数组,特别是对于char *
字符串)等)和实现先前定义的结构类型的递归处理器以后的结构。
快速示例:您的令牌def类似于:
struct token_def
{
char *token_name;
enum supported_token_types token_type;
int array_length;
int token_offset;
}
因此您的示例结构将填入
{
{ "aaa1", TT_INT, 1, 0 },
{ "aaa2", TT_INT, 1, 4 },
{ "bbb1", TT_CHAR, 1, 8 },
}
等。如果你之后有一个bbb2元素是一个10字节的字符串,那么它可能看起来像:
{ "bbb2", TT_CHAR, 10, 9 },
虽然9将依赖于填充规则,并且可能像12或其他东西。填充可能是你要解决的最难的问题,但实际上如果你“得到它”就相当简单。
我似乎记得可能有一个库已经为你做了这个,但我找不到快速搜索。祝你好运。