c - 在 C 中使用标记连接访问和修改变量
问题描述
我一直在阅读有关字符串化和令牌粘贴的内容,我试图使用令牌粘贴来访问变量并修改它的值。这样的事情可能吗?
假设变量a0
和a1
已定义,并且在运行时我想使用令牌粘贴来打印它们的值,因为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)
谁能建议我如何实现它,因为我很想解决这个问题。
解决方案
您的期望a##dummyvar
会a<value of dummyvar>
从根本上误解宏的作用(即简单的文本替换)。的输出adummy
是正确的。
您无法在运行时通过宏实现对变量值的动态访问,就像您在此处尝试的那样,因为它们在编译之前被评估并且不知道程序在运行时的状态。
推荐阅读
- node.js - How do i create a public ledger using blockchain for my application?
- ionic-framework - @types/node@^8.0.7 的 npm WARN tarball tarball 数据似乎已损坏
- eclipse - 如何获取已执行的 Datatable 行的每一行的状态
- amazon-web-services - 将 awslogs 与 kubernetes '本机'结合使用
- mysql - 是否可以将此拒绝转换为 Rails 活动记录查询?
- java - AbstractGraphicalEditPart(GMF) 的上下文相关帮助
- c++ - 有没有简单的方法将 uchar 数组复制到双精度数组?
- python - 条件满足时如何结束循环?
- node.js - 如何修复“Aws S3 上传失败”。访问被拒绝,区域:null,状态代码:NodeJs 上的 403'
- vue.js - 本地存储修改状态?