首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 宏的使用(1)
【标  题】:宏的使用(1)
【关键字】:
【来  源】:http://www.cublog.cn/u/22576/showart.php?id=156006

宏的使用(1)

宏带参数的情况:
 
#define FUNC_ARGS(a, b) \
  void func1(void) {\
       printf("%d, %d", (a), (b));\
  }
 
用##的特殊用法:
 
#define FUNC(name) \
  void name##Get(void) {\
     printf("hello world"); \
  }
 
##的意思是分隔连续的字符,比如我们的函数名字是 *****Get(),那么可以用上
面的宏,但如果是My*****Get(),那么宏就应该这样void My##name##Get(void) {,   如果不用##分隔,写成MynameGet,那么生成的函数只能为void MynameGet();分割后,宏将把参数部分比较分割的每个部分进行替换。
 
FUNC(helloworld);
FUNC(worldhello);
展开后为:
void helloworldGet(void) {
   printf("hello world");
}
void worldhelloGet(void) {
   printf("hello world");
}
 
另一个#的特殊用法:
 
#define FUNC(arg) \
  void print##arg(void) {\
     printf(#arg " = %d", arg);\
  }
 
FUNC(size); 生成代码:
void printsize(void) {
  printf("size" " = %d", size );
}
 
我在实际工作中的应用有一个struct,比如:
 
struct Flags {
  int iflag1;
  int iflag2;
  int iflag3;
} flag;
 
对应每一个flagN,我要写一个Get,一个Set,形如:
void ui_flag1Get(void) {
   return flag.iflag1;
}
int ui_flag1Set(int iflag) {
  flag.iflag1 = iflag;
}
 
现在我定义宏如下:
 
#define UI_FLAG_GETSET_DEFINE(name) \
   void ui_##name##Get(void) { \
      return flag.i##name;\
   }\
   int ui_##name##Set(int iflag) {\
     flag.i##name = iflag;\
   }
 
代码简化为:
UI_FLAG_GETSET_DEFINE(flag1);
UI_FLAG_GETSET_DEFINE(flag2);
UI_FLAG_GETSET_DEFINE(flag3);
 
好莱坞恐怖片《来电惊魂》:【上一篇】
C++语言学习书籍推荐:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 协同商务:全球制造业的下一热点(上)
  • 删除sqlserver中的sa帐户[from www.haiyang.net]
  • Linux下构造高性能、高可用、高可伸缩性的服务集群
  • 用FREEBASIC写标准DLL
  • asp在SQL SER2k中新建帐号和给帐号权限的实现
  • 标准注入语句 下
  • Oracle维护常用SQL语句
  • 查看统计隐藏的目录和文件所占用的空间
  • offsetParent和parentElement的区别
  • VB API教程(王国荣版)(一)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.