C语言中 #和##的运用

原文地址:http://koumeng5.blog.163.com/blog/static/35719040201111511595273/

用的是CC2530作无线温度采集遇到一些问题如下面的定义:

#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BM(pin); \
  P##port##_##pin## = val; \
  P##port##DIR |= BM(pin); )

#define st(x) do { x } while (__LINE__ ==-1)

当时在网上找了很久才找到以下资料。感觉很好就贴出来,大家共享。

1. 宏可以像函数一样被定义,例如:< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

#define min(x,y) (x 但是在实际使用时,只有当写上min(),必须加括号,min才会被作为宏展开,否则不做任何处理。
2.
如果宏需要参数,你可以不传,编译器会给你警告(宏参数不够),但是这会导致错误。如C++书籍中所描述的,编译器(预处理器)对宏的语法检查不够,所以更多的检查性工作得你自己来做。

3. 很多程序员不知道的###

#符号把一个符号直接转换为字符串,例如:

#define STRING(x) #x

const char *str = STRING( test_string ); str的内容就是"test_string",也就是说#会把其后的符号直接加上双引号。

##符号会连接两个符号,从而产生新的符号(词法层次),例如:

#define SIGN( x ) INT_##x

int SIGN( 1 ); 宏被展开后将成为:int INT_1;

4. 变参宏,这个比较酷,它使得你可以定义类似的宏:

#define LOG( format, ... ) printf( format, __VA_ARGS__ )

LOG( "%s %d", str, count );

__VA_ARGS__是系统预定义宏,被自动替换为参数列表。

5. 当一个宏自己调用自己时,会发生什么?例如:

#define TEST( x ) ( x + TEST( x ) )

TEST( 1 ); 会发生什么?为了防止无限制递归展开,语法规定,当一个宏遇到自己时,就停止展开,也就是说,当对TEST( 1 )进行展开时,展开过程中又发现了一个TEST,那么就将这个TEST当作一般的符号。TEST(1)最终被展开为:1 + TEST( 1)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值