有趣的宏定义
来源:互联网 发布: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;}
阅读全文
0 0
- 有趣的宏定义
- C++宏定义的一种有趣应用
- 有用有趣的某些定义
- lwip--有趣的数组定义(预处理)
- lwip--有趣的数组定义(预处理)
- 它被定义了,但它却被定义为未定义——有趣的宏定义
- lwip--有趣的数组定义(预处理) ——转
- python中修改类定义的有趣现象
- lwip【2】 lwip--有趣的数组定义(预处理)
- Spring Data Repository有趣的定义query方法
- 关于宏的有趣应用
- 有趣的
- [bzoj 1222] [HNOI2001]产品加工:状态的定义很有趣的DP
- 关于#define宏的有趣的事情
- 宏(Macro, define)的一个有趣用法
- linux内核中的一些有趣的宏
- 有趣的地方,有趣的东西!
- 有趣的生活,有趣的比赛
- 【Leetcode】【python】Remove Duplicates from Sorted Array/Remove Duplicates from Sorted Array II
- 统计文本中某些词出现的次数
- 【剑指offer】面试题4:二维数组的查找
- Python eval函数
- 设计模式--观察者模式
- 有趣的宏定义
- ES6 函数的参数设置默认值
- docker之windows10安装步骤
- 二叉树的先序递归创建和遍历
- java单例模式单写法
- Python 可变变量与不可变变量
- Learning Of JDBC About The Java&Mysql
- 数据库索引的原理、特点及用法
- 洛谷 P2324 [SCOI2005]骑士精神