有趣的宏定义

本文探讨了C语言中宏的特殊用法及其潜在风险,包括do...while(0)结构、宏定义后的斜杠及#与##操作符的使用,并通过实例说明这些技巧如何影响代码行为。

我不得不讲,宏是真的666!
你以为你学会C语言了?不信你来瞧瞧下面这玩意!!!
(PS:纯属巧合,在PCA的学习中偶然发现的硬件代码,我简直无FUCK可说,刚一开始,我还曾坚信楼主的傻逼,直到现在才知道自己的low)

话不多说,这就开始:
1.有关在宏中进行do{……}while(0);
do while 的结构 意味着程序肯定会执行,while(0)意味着肯定会只执行一次。
有关缘由,其实也挺容易想到的,宏就是简单的宏替换。这是最大的优点,也是最坏的缺点。
eg:

#define FOOL(x) 
do
{
    var(x);tar(x);
}while(0);
int main()
{
    if(x>0)
        FOOL(x);
    else
        printf("NO\n");
    return 0;
}

简单的FOOL(x)宏替换后,程序结构的错误导致了更严重的逻辑错误。

有人讲:你直接在FOOL(x)的宏定义后直接加一个大括号不就行了吗?!
看官接着看

#define FOOL(x){    var(x);tar(x);}
int main()
{
    if(x>0)
        FOOL(x);
    else
        printf("NO\n");
    return 0;
}

宏替换后,岂不是要在花括号外继续加一个分号,你觉得呢?

总之宏替换,贼好用的一个东西!度娘说的好,确实增加了什么可读性,拓展性,灵活性。
其实无形之中也增加了代码的逼格性!!!

/更新——————————————–/
原来还有一个更有意思的东西,突然想到以前好像在哪看过,但是因为从没用过,所以没一点印象。哈哈哈:)

就是一点关于宏定义后加的斜杠
上代码:

#define MakeByte(target, Hi,Lo) \  
do{ \  
    target |= (((Hi)<<4)|(Lo)); \   
}while(0); \  

其实你也可以试试,如果此时去掉”\”,编译器会毫不留情的报错。
因为,预编译宏中允许是只能一行的,但是为了美观这样搞似乎更好!!!

2.有关宏中#以及##的用法
简而言之,#就是用来将宏参数转换成字符串的。
而##是将两个字符无间隔的连接起来。
说的可能不太直观,让我们上例子
eg: 1.

#define A(x) #x
#define B(a,b) a##b

int main()
{
    printf(A(3ty));             //输出字符串 "3TY"
    printf(B(a,b));             //输出字符 "ab"
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值