请教有没有技巧在宏中展开变量的值

发布于 2022-10-15 07:27:09 字数 227 浏览 27 评论 0

#define MARCO(x, y)        x.##y

如果直接使用上面的宏

MARCO(a, b)
//a为一结构体名称,b为一变量名,char b[24] = "abc";

则会生成a.b,而我想让b展开,生成一个a.abc,

请问大家有没有什么变通的方法没有??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

烟沫凡尘 2022-10-22 07:27:09

回复 1# 独孤九贱

如果是变量,做不到。预处理器(编译器也做不到)根本就不知道变量的值是什么。如果是常量,把它定义成宏,预处理器就可以搞定。

剧终人散尽 2022-10-22 07:27:09

这个我知道,所以我问的是“有没有什么变通的技巧……”

在一个项目里,需要用类似的技巧来实现以下功能:

hash表中有若干的“name=>value”的“关键字-值”对,现在需要循环遍历该表,将name对应的值,赋给结构体的相应的成员。结构体的成员名称跟表中的name相同。

如果手动赋值,或者是为每一个hash表(这样的hash表有上百个)再维护一个“名称--结构体成员”的列表,工作量巨大。所以才来请教一下大家。

七色彩虹 2022-10-22 07:27:09

去掉“##”

  1. struct st
  2. {
  3.     char a[10];
  4.     int  b;
  5. };
  6. #define M(a,b) a.b
  7. int main()
  8. {
  9.     struct st s1 = {"abc", 10};
  10.     printf("%s\n", M(s1,a));
  11.     return 0;
  12. }

复制代码

  1. [root@liukun8 tmp]# cc b.c
  2. [root@liukun8 tmp]# ./a.out
  3. abc

复制代码

度的依靠╰つ 2022-10-22 07:27:09

如果反其道而行之,gcc有没有扩展的方法,可以取得结构体每个变量的字符串名称,也可以……

禾厶谷欠 2022-10-22 07:27:09

本帖最后由 freebarque 于 2011-05-10 10:55 编辑

哈,同问,有没办法, 让“abc”进去,  abc出来

把一个字符串里面的内容,可以转变成一个变量名

眼中杀气 2022-10-22 07:27:09

回复 5# 独孤九贱

    呵呵
看错了哈,变量好像的确不行。

银河中√捞星星 2022-10-22 07:27:09

哈哈,九贱大神的帖子,顶一个

甜尕妞 2022-10-22 07:27:09

变量的值是运行时才决定的,编译的时候都是未知的,怎么能展的开?

能想到的比较简单的方法就是写个转换函数

  1. if (strcmp(name, "abc") == 0)
  2.         a.abc = value;
  3. else if (strcmp(name, "bcd") == 0)
  4.         a.bcd = value;
  5.         .....

复制代码结构体复杂的话可以用个脚本来自动生成代码,也不是很麻烦。

妞丶爷亲个 2022-10-22 07:27:09

这个我知道,所以我问的是“有没有什么变通的技巧……”

在一个项目里,需要用类似的技巧来实现以下功能 ...
独孤九贱 发表于 2011-05-10 10:07

    再建一张表
名字->地址

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文