免费注册 查看新帖 |

Chinaunix

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

如何根据变量值选择不同的宏定义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-16 21:08 |只看该作者 |倒序浏览
问下各位牛人 我想在程序中通过一个变量值来决定用哪一套宏定义  
比如  
if(y变量)  
{  
#define x 1  
}  
else  
{  
#define x 2  
}  

但宏定义都是先编译执行的,请问各位大哥大姐有没有什么好的方法?

论坛徽章:
0
2 [报告]
发表于 2010-09-17 00:49 |只看该作者
直接设变量不就行了   

用宏应该没有办法使用运行时才能得到的值

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2010-09-17 11:36 |只看该作者
把你的宏定义加个参数,用来判断你的变量的

论坛徽章:
0
4 [报告]
发表于 2010-09-17 11:41 |只看该作者
[Quote=引用 10 楼 bobo364 的回复:]

引用 的回复:
用变量应该不行吧,可以用另一个宏控制
#ifdef HH
{
#define x 1
}
#elf
{
#define x 2
}
#endif


用这个是可以的,版本控制中用的很多

HH这个宏也是预先就知道是否定义了,不能满足通过变量值选取的需求啊。
其实我是想根据读取外界的一个值来定做多套系统,比如说从eeprom读取一个硬件版本号,来区分不同的软件版本(有不同的资源分配)。所以宏能否提供这样的功能吗?

论坛徽章:
0
5 [报告]
发表于 2010-09-17 13:51 |只看该作者
把你的宏定义加个参数,用来判断你的变量的
Godbach 发表于 2010-09-17 11:36



    你的提法我好像看过,但是一时忘记了,能否给明示一下做法?
   谢谢!或者是原语,呵呵

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2010-09-17 13:59 |只看该作者
你的提法我好像看过,但是一时忘记了,能否给明示一下做法?
   谢谢!或者是原语,呵呵
againyuan 发表于 2010-09-17 13:51

把你的需求说明确一些。你就是需要变量值不同的时候,定义不同宏吧,那你定义的宏什么时候用呢?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-09-17 14:02 |只看该作者
类似于下面这样的可以么,x 就是你的那个变量
#define VAR(x) do { \
       if(x == A){         \
                do AA;      \
       }else if(x == B){\
                do BB;       \
       }                       \
}while(0)

论坛徽章:
0
8 [报告]
发表于 2010-09-17 14:21 |只看该作者
类似于下面这样的可以么,x 就是你的那个变量
Godbach 发表于 2010-09-17 14:02



    一看就是做内核的风格,我的需求应该是根据x数值的不同去定义不同的宏,然后不同的宏去决定下面的不同应用
#define VAR(x) do { \
       if(x == A){         \
                #define HOMEPLUG     \
       }else if(x == B){\
                #define MOCA       \
       }                       \
}while(0)
但是如此的定义是不成立的。

我们的需求是
原语:
       read x;
          VAR(x)
          #ifdef HOMEPLUG
                APP1
          #elif MOCA
                APP2
          #endif
大侠看有什么solution?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2010-09-17 14:57 |只看该作者
       read x;
          VAR(x)
          #ifdef HOMEPLUG
                APP1
          #elif MOCA
                APP2
          #endif

直接替换成
       read x;

          if(x == A){
                APP1
          }else if(x == B){
                APP2
          }

可以么?

论坛徽章:
0
10 [报告]
发表于 2010-09-17 15:47 |只看该作者
回复 1# againyuan


    楼主的要求不可能实现吧,宏定义是属于编译器预处理阶段分析的语法,而真正涉及到if等等的语法分析是在编译阶段的语法分析做的,所以,到了语法分析阶段,所有的宏定义已经被预处理为具体的内容了,怎么还能够再次执行预处理去处理宏定义呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP