免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 聪聪知不道
打印 上一主题 下一主题

谁来举例讲讲#define ##在实际代码中的用处啊 [复制链接]

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
11 [报告]
发表于 2010-07-27 22:14 |只看该作者
好像很牛叉的样子,谁来解释一下。。。。。。
  1. #include <stdio.h>

  2. #define ID(prefix,id_str) prefix##id_str
  3. #define ID_STR(id)    "id_"#id


  4. int main()
  5. {
  6.     char test[] = "test";
  7.     printf("%s\n",ID(te,st));

  8.     printf("%s\n",ID_STR(test));
  9.     return 0;
  10. }
复制代码
ID(te,st)                ==>        te##st              ?????
ID_STR(test)         ==>        "id_"#test         ?????

论坛徽章:
0
12 [报告]
发表于 2010-07-27 22:23 |只看该作者
te##st   => test

"id_"#test => "id_test"

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
13 [报告]
发表于 2010-07-27 22:26 |只看该作者
te##st   => test

"id_"#test => "id_test"
zhangsuozhu 发表于 2010-07-27 22:23


这个。。。。。这又是什么东东,规范还是编译器?

论坛徽章:
0
14 [报告]
发表于 2010-07-27 22:29 |只看该作者

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
15 [报告]
发表于 2010-07-27 22:34 |只看该作者

zhangsuozhu 发表于 2010-07-27 22:29



是规范说宏应该有这样的行为还是编译器的扩展?

论坛徽章:
0
16 [报告]
发表于 2010-07-27 22:45 |只看该作者
标准宏

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
17 [报告]
发表于 2010-07-27 22:51 |只看该作者
额,惭愧,第一次听说。今天学到不少东西,在微博里记一下。。。。。

宏的应用真是令人眼花缭乱,印象比较深的是《C语言专家编程》里说的那个用宏“画”字符。。。。。。

论坛徽章:
0
18 [报告]
发表于 2010-07-27 23:20 |只看该作者
这个我前段也遇到过,看作者是实现了一个简单的封装:

  1. #define get_stats(x)   char * get_##X##_stats()
  2. get_stats(cpu);
  3. get_stats(mem);
复制代码
这样一堆的定义。

论坛徽章:
0
19 [报告]
发表于 2010-07-28 10:22 |只看该作者
其实,在实际编程中,这样的宏用的比较少。以前我写过一个:


  1.   #define _LOG_LEVEL_DEBUG 0
  2.   #define _LOG_LEVEL_INFO 1
  3.   #define _LOG_LEVEL_WARN 2
  4.   #define _LOG_LEVEL_ERROR 3
  5.   #define _LOG_LEVEL_FATAL 4


  6. #define _LOG(level, fmt,...) \
  7.       _LOG_LEVEL > _LOG_LEVEL_##level ? (void)0 : (void)printf("[%s] [%d] ["#level"]: "#fmt"\n", GetTime().c_str(), __LINE__,
  8.    ##__VA_ARGS__)

  9. 使用的时候:
  10. _LOG(ERROR, "myerror<%s>",
  11.                   errmsg.c_str());
复制代码

论坛徽章:
0
20 [报告]
发表于 2010-07-28 19:08 |只看该作者
谢谢大家,辛苦了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP