【问题标题】:Accessing and modifying variables using token concatenation in C在 C 中使用标记连接访问和修改变量
【发布时间】:2019-01-17 16:52:04
【问题描述】:

我一直在阅读有关字符串化和令牌粘贴的内容,我试图使用令牌粘贴来访问变量并修改它的值。这样的事情可能吗?

假设变量 a0a1 已定义,并且在运行时我想使用标记粘贴将它们的值打印为 printf("\n\rValue is %d",VAR_PARSER(0)); 这就是我所做的。

#include "stdio.h"
#include "stdlib.h"

#define VAR_PARSER(dummyvar,index,value) do{\
dummyvar = index;\
a##dummyvar = value;\
}while(0);

unsigned char a0, a1, dummy;
int main (void)
{   
    unsigned char ucloopcnt;
    for(ucloopcnt = 0; ucloopcnt < 2; ucloopcnt++) VAR_PARSER(dummy,ucloopcnt,(ucloopcnt * 10));

    printf("\n\rValue is %d %d",a0,a1);

    return 0;
}

现在,在a##dummyvar = value; 这一行,我希望输出分别为a0 = 10;a1 = 20;。但似乎它转换为adummy并给出以下错误adummy undeclared (first used in this funciton)

任何人都可以建议我如何实现它,因为我很想解决这个问题。

【问题讨论】:

  • 宏用于文本替换;他们不会为您评估变量值。
  • 那么,有没有办法在循环中动态访问变量名,因为我试图在最后一步实现这一点?
  • 否;宏是编译时操作;您正在尝试使用运行时值评估事物。

标签: c tokenize stringification


【解决方案1】:

您期望 a##dummyvar 会评估为 a&lt;value of dummyvar&gt; 从根本上误解了宏的作用(即简单的文本替换)。 adummy 的输出是正确的。

您无法在运行时通过宏实现对变量值的动态访问,就像您在这里尝试的那样,因为它们在编译之前被评估并且不知道程序在运行时的状态。

【讨论】:

  • 好的。那么,如果我想实现变量的动态访问,还有其他的主题/方法可以参考吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多