C语言宏的高级用法

本文详细介绍了C语言宏的高级用法,包括#和##的字符串化和连接功能,变参宏的使用,宏错误嵌套的避免,操作符优先级问题,消除多余分号的策略以及防止副作用重复的方法。通过对宏的深入理解,可以更好地利用宏来优化代码并减少错误。
摘要由CSDN通过智能技术生成

 转至 http://hi.baidu.com/hhs_ky/blog/item/bdc4d101e8183b01738da5b6.html
关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:

#define WARN_IF(EXP)     /
     do{ if (EXP)     /
             fprintf(stderr, "Warning: " #EXP "/n"); }    /
     while(0)

那么实际使用中会出现下面所示的替换过程:

WARN_IF (divider == 0);

被替换为

do {
     if (divider == 0)
fprintf(stderr, "Warning" "divider == 0" "/n");
} while(0);

这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。

而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用:

struct command
{
char * name;
void (*function) (void);
};

#define COMMAND(NAME) { NAME, NAME ## _command }

// 然后你就用一些预先定义好的命令来方便的初始化一个command结构的数组了:

struct command c
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值