在 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;
}
在运行时访问变量名没有任何意义。每个初学者都会在某个时候得到这个想法,但它源于对“引擎盖下”发生的事情缺乏了解。变量名、函数名、类型等标识符仅存在于您的源代码中。他们在那里帮助程序员。在编译的二进制文件中,没有任何标识符的痕迹。
对于您尝试实现的目标,应该使用各种语言机制:枚举、指针、函数指针等。至于您的具体情况,关于您要达到的目标的信息太少,无法就如何解决它提出建议。
编译程序不知道标识符的名称(忽略 dlsym 魔术),所以不,没有办法在运行时测试对某些结构成员的访问。但是如果你只需要根据一些字符串选择成员,那么
if (strcmp (user_input, "aaa1") == 0) {
/* do something to alp->aaa1 */
} else if (strcmp (user_input, "aaa2") == 0) {
/* do something to alp->aaa2 */
}
如果你下定决心,通常有办法做每一件事。只是有时治愈比疾病更糟糕。
过去,我有正当理由做这样的事情,我们想出的最佳解决方案是逐字解析定义相关数据的头文件。
这不是一个容易解决的问题;当你解析你的头文件时,你需要注意以下几点:变量名、变量类型和任何可能出现的填充。当你解析每个元素时,你会保存一个你跟踪的偏移量,这样当你以后得到你的名字时,你可以将值填充到类似的东西中: (unsigned char *)(&data_structure + var_offset)
.
在解析 xml 时,您将查找元素名称,并调用一个处理程序(您编写的)为您需要支持的每种数据类型放入数据。最常见的是,您可能需要一个int
处理程序和一个char *
(或其他)处理程序。实现简单定义(通常作为数组大小的常量值(哦,是的,您必须实现数组,尤其是char *
字符串)等)和实现先前定义的结构类型的递归处理器的奖励点,这些结构类型被以后的结构引用。
快速示例:您的令牌定义将类似于:
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 或其他东西。填充可能是你最难解决的问题,尽管实际上如果你“明白”它是相当简单的。
我似乎记得可能已经有一个库可以为您执行此操作,但我无法通过快速搜索找到它。祝你好运。