0

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

3 回答 3

3

在运行时访问变量名没有任何意义。每个初学者都会在某个时候得到这个想法,但它源于对“引擎盖下”发生的事情缺乏了解。变量名、函数名、类型等标识符仅存在于您的源代码中。他们在那里帮助程序员。在编译的二进制文件中,没有任何标识符的痕迹。

对于您尝试实现的目标,应该使用各种语言机制:枚举、指针、函数指针等。至于您的具体情况,关于您要达到的目标的信息太少,无法就如何解决它提出建议。

于 2013-10-07T09:41:30.580 回答
2

编译程序不知道标识符的名称(忽略 dlsym 魔术),所以不,没有办法在运行时测试对某些结构成员的访问。但是如果你只需要根据一些字符串选择成员,那么

 if (strcmp (user_input, "aaa1") == 0) {
        /* do something to alp->aaa1 */
 } else if (strcmp (user_input, "aaa2") == 0) {
        /* do something to alp->aaa2 */
 }
于 2013-10-07T09:33:09.450 回答
1

如果你下定决心,通常有办法做每一件事。只是有时治愈比疾病更糟糕。

过去,我有正当理由做这样的事情,我们想出的最佳解决方案是逐字解析定义相关数据的头文件。

这不是一个容易解决的问题;当你解析你的头文件时,你需要注意以下几点:变量名、变量类型和任何可能出现的填充。当你解析每个元素时,你会保存一个你跟踪的偏移量,这样当你以后得到你的名字时,你可以将值填充到类似的东西中: (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 或其他东西。填充可能是你最难解决的问题,尽管实际上如果你“明白”它是相当简单的。

我似乎记得可能已经有一个库可以为您执行此操作,但我无法通过快速搜索找到它。祝你好运。

于 2013-10-07T11:26:51.697 回答