在C语言中,是否可以在运行时通过指针访问变量名

在C语言中,是否可以在运行时通过指针访问变量名,c,structure,C,Structure,在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 ma

在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 magic),因此无法在运行时测试对某些结构成员的访问。但是如果您只需要根据某个字符串选择成员,那么

 if (strcmp (user_input, "aaa1") == 0) {
        /* do something to alp->aaa1 */
 } else if (strcmp (user_input, "aaa2") == 0) {
        /* do something to alp->aaa2 */
 }

已编译程序不知道标识符的名称(忽略dlsym magic),因此无法在运行时测试对某些结构成员的访问。但是如果您只需要根据某个字符串选择成员,那么

 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\u structure+var\u offset)

在解析xml时,您将查找元素名,并调用(您编写的)处理程序,以便为需要支持的每种类型的数据输入数据。最常见的情况是,您可能需要一个
int
处理程序和一个
char*
(或其他)处理程序。实现简单定义(通常为数组大小的常量值(哦,是的,您必须实现数组,尤其是
char*
strings)等)和实现后面结构引用的先前定义的结构类型的递归处理器的额外点

快速示例:您的令牌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或其他。填充可能是你最难解决的问题,尽管在现实中,如果你“明白了”的话,它是相当简单的


我似乎记得可能有一个图书馆已经为你做了这件事,但我无法通过快速搜索找到它。祝你好运。

只要你下定决心,做每件事通常都有办法。只是有时候治疗比疾病本身更糟糕

在过去,我一直有这样做的正当理由,我们提出的最好的解决方案是从字面上解析定义相关数据的头文件

这不是一个容易解决的问题;在解析头文件时,需要注意以下事项:变量名、变量类型以及可能出现的任何填充。在解析每个元素时,您会保存一个跟踪的偏移量,以便在以后获得名称时,将值填充到类似以下内容中:
(unsigned char*)(&data\u structure+var\u offset)

在解析xml时,您将查找元素名,并调用(您编写的)处理程序,以便为需要支持的每种类型的数据输入数据。最常见的情况是,您可能需要一个
int
处理程序和一个
char*
(或其他)处理程序。实现简单定义(通常为数组大小的常量值(哦,是的,您必须实现数组,尤其是
char*
strings)等)和实现后面结构引用的先前定义的结构类型的递归处理器的额外点

快速示例:您的令牌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或其他。填充可能是你最难解决的问题,尽管在现实中,如果你“明白了”的话,它是相当简单的


我似乎记得可能有一个图书馆已经为你做了这件事,但我无法通过快速搜索找到它。祝你好运。

你应该
那样做打开
其他
;)没有。此评论中的所有其他内容都已写入