我不得不讲,宏是真的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;
}
本文探讨了C语言中宏的特殊用法及其潜在风险,包括do...while(0)结构、宏定义后的斜杠及#与##操作符的使用,并通过实例说明这些技巧如何影响代码行为。
623

被折叠的 条评论
为什么被折叠?



