#define xxx do{...} while(0) 宏定义】的更多相关文章

linux内核和其他一些开源的代码中,经常会遇到这样的代码: do{ ... }while(0) 这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢? 实际上,do{...}while(0)的作用远大于美化你的代码.查了些资料,总结起来这样写主要有以下几点好处: 1.辅助定义复杂的宏,避免引用的时候出错: 举例来说,假设你需要定义这样一个宏: #define DOSOMETHING()\ foo1();\ foo2(); 这个宏的本意是,当调用DOS…
<ol> <li>函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心.</li> <li>调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同.如果是真正的函数,那么它的函数体要编译生成指令,代码中出现的每次调用也要编译生成传参指令和call指令.而如果是函数式宏定义,这个宏定义本身倒不必编译生成指令,但是代码中出现的每次调用编译生成的指令都相当于一个函数体,而不是简单的几条传参指令和call指令.所以…
要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义: #define MAX( a, b) ( (a) > (b) (a) : (b) ) 其次,把它用函数来实现: int max( int a, int b)…
当需要判断iOS系统版本的时候,相信很多人都会这么干: #define SystemVersion [[UIDevice currentDevice] systemVersion].floatValue 现在告诉屌丝们一个更好的办法就是其实系统已经做了类似的宏定义,不需要我们再去定义了 在Simulator-IOS7.0/usr/include/Availability.h中已经定义了很多系统的宏: 然后使用: #ifdef __IPHONE_7_0  //iOS7的新特性代码#endif 或者…
1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co…
1.先来几个常用的: // 是否高清屏 #define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO) // 是否模拟器 #define isSimulator (NSNotFound != [[[UIDevice curre…
现在还没怎么用到宏定义,但以后肯定会经常用的,写下这盘,以后忘记了可以温故.首先宏定义必须写在函数之外,其作用域从宏定义命令起到源程序结束,也就是说一但定义系统就会分配内存,想让它结束用“#undef“命令,格式如下:#define 标识符 字符串,记住不能加封号,假如宏名在源程序中用双引号括起来,则已成为字符串中的字符,预处理程序不对其进行宏替换,例子: #include "stdio.h" #define OK 100 void main() { printf("OK&q…
概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所定义的宏名.“字符串”可以是常数,表达式.格式串等 举例: #define PI 3.1415926 作用: 就是用指定标识符PI来代替数3.1415926 对源程序作编译时, 将先由预处理程序进行宏代换, 即用3.1415926表达式去置换所有的宏名PI, 然后编译 #include <stdio.h…
最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在: 1. 增加代码的适应性 下面的宏定义没有使用do{...}while(0) #define FOO(x) foo(x); bar(x); 这样宏定义,单独调用不会出现问题,例如: FOO() 宏扩展后变成: foo(x);bar(x); 这样调用FOO没有任何问题,但是FOO(x)不能…
C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在: 1. 增加代码的适应性 下面的宏定义没有使用do{...}while(0) #define FOO(x) foo(x); bar(x); 这样宏定义,单独调用不会出现问题,例如: FOO(100) 宏扩展后变成: 1 f…