Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255843
  • 博文数量: 65
  • 博客积分: 2599
  • 博客等级: 少校
  • 技术积分: 710
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-04 10:49
文章分类

全部博文(65)

文章存档

2015年(4)

2013年(2)

2012年(4)

2011年(51)

2010年(4)

分类: LINUX

2011-12-07 23:50:58

1. #
可以将宏参数当成字符串。
#define TOSTRING(arg) (#arg)
printf("%s\n%s\n", TOSTRING(abc), TOSTRING(123));

结果:
abc
123

2. ##
可以将宏参数进行连接,但是最后产生一个C语言符号,而不是字符串。
#define CONNECTSTR(str1, str2) (final_string_##str1##_##str2)
CONNECTSTR(hello, world) 产生符号 final_string_hello_world

3. 宏展开
一般情况下,宏参数如果是一个宏的话,会首先将宏参数展开。
但是如果宏中有#或者##的话,就不会展开。

4. 调试宏
#define TOSTRING(arg) (#arg)
#define MACRO_DBG(arg) TOSTRING(arg)
#define ADD(a, b) ((a)+(b))

printf("%s\n", MACRO_DBG(ADD(1, 2)));
结果:
((1)+(2))

5.宏变参
#define yourerr(fmt, ...) \
    printf("[%s][%s][%d]: ", __FILE__ ,__func__, __LINE__);\
    printf(fmt, __VA_ARGS__)
阅读(1794) | 评论(2) | 转发(1) |
0

上一篇:Eclipse 配置

下一篇:文件相关flags

给主人留下些什么吧!~~

ville_lee2011-12-09 17:35:15

马夹GG: 哦?不太了解,宏与字符串有什么区别和联系呢?.....
通过#进行转换的宏,在预处理之后会变成一个字符串,之后和一般的常量字符串就一样了。
char *str = TOSTRING(hello world);
预处理之后就变成了
char *str = "hello world";

马夹GG2011-12-09 00:35:47

哦?不太了解,宏与字符串有什么区别和联系呢?