免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8462 | 回复: 7
打印 上一主题 下一主题

[C] 问一个预处理问题,怎么动态生成变量名 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-18 18:36 |只看该作者 |倒序浏览
#define setname( name ) test##name

int setname(1) = 1;
int setname(5) = 2;

#define var 8
int setname(var) = 0;


这样搞了之后,我本来是想要 int test8 = 0;
但事实上是 int testvar = 0;

有没有办法得到我要的结果呢?

论坛徽章:
0
2 [报告]
发表于 2009-02-18 18:40 |只看该作者
不能直接 setname(8)?

论坛徽章:
0
3 [报告]
发表于 2009-02-18 18:51 |只看该作者

回复 #2 langue 的帖子

是啊,var的值是另外一个.h里面define的
我也在想实在没办法只能把8写在这里了
这样的话define var 就没有意义了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2009-02-18 22:09 |只看该作者

  1. #include <stdio.h>

  2. #define SET_NAME(name) SET_NAME_1(name)
  3. #define SET_NAME_1(name) SET_NAME_2(name)
  4. #define SET_NAME_2(name) test##name

  5. int main()
  6. {
  7.     int SET_NAME(1212) = 1212;
  8. #define VAR 326
  9.     int SET_NAME(VAR) = 326;
  10. #undef VAR
  11. #define VAR 86
  12.     int SET_NAME(VAR) = 86;
  13. #undef VAR
  14.     printf("%d %d %d\n",test1212,test326,test86);
  15.     return 0;
  16. }

复制代码

论坛徽章:
0
5 [报告]
发表于 2009-02-18 23:01 |只看该作者
楼上能解释一下为什么要#define SET_NAME(name) SET_NAME_1(name) 这样呢? 为什么不这样转一下就没法让VAR预编译成define的值?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2009-02-19 00:20 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2009-02-19 01:53 |只看该作者
多谢楼上 我试了一下,少用一个define 也行
#include <stdio.h>

#define SET_NAME(name) SET_NAME_2(name)
//#define SET_NAME_1(name) SET_NAME_2(name)
#define SET_NAME_2(name) test##name

int main()
{
    int SET_NAME(1212) = 1212;
#define VAR 326
    int SET_NAME(VAR) = 326;
#undef VAR
#define VAR 86
    int SET_NAME(VAR) = 86;
#undef VAR
    printf("%d %d %d\n",test1212,test326,test86);
    return 0;
}

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
8 [报告]
发表于 2009-02-19 02:42 |只看该作者

回复 #7 flashdriver 的帖子

嗯, 确实是我弄错了。
通常的3个是因为有一个用做隐藏__LINE__

比如
#define CONNECTION(text1,text2) text1##text2
#define CONTECT(text1,text2) CONNECTION(text1,text2)

    int CONNECT(test,1212) = 1212; //  int test1212 = 1212;

#define VAR 326
    int CONNECT(test,VAR) = 326; // int test326 = 326;
#undef VAR

#define VAR 86
    int CONNECT(test,VAR) = 86; // int test86 = 86;
#undef VAR

   int CONNECT(test,__LINE__) = __LINE__; // int testXXX = XXX;


为了方便的自动命名,出现第3个宏
#define CONNECT_BY_LINE(text) CONNECT(text,__LINE__)

   int CONNECT_BY_LINE(test) = __LINE__; // int testYYY = YYY;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP