有趣的宏定义

来源:互联网 发布:windows程序设计算c 编辑:程序博客网 时间:2024/05/18 19:20

我不得不讲,宏是真的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##bint main(){    printf(A(3ty));             //输出字符串 "3TY"    printf(B(a,b));             //输出字符 "ab"    return 0;}
原创粉丝点击