OC宏定义

usr/include


#空指令,无任何效果

#include 包含一个源代码文件

#define 定义宏

#undef 取消已定义的宏

#if 如果给定条件为真,则编译下面代码

#ifdef 如果宏已经定义,则编译下面代码

#ifndef 如果宏没有定义,则编译下面代码

#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码

#endif 结束一个#if……#else条件编译块

#error 停止编译并显示错误信息

资料来源:http://blog.csdn.net/wwwang89123/article/details/17436577


#define 是预处理命令,在编译预处理时进行简单的替换,不作正确性检查

typedef 是编译时处理,在自己的作用域内给一个已经存在的类型一个别名

宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点代码的第三行:

typedef    (int*)      pINT;以及下面这行:#define    pINT2   int*

效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;表示定义了一个整型指针变量a和整型变量b。

注意:两者还有一个行尾;号的区别哦!


宏的高级使用

1)__VA_ARGS__:总体来说就是将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的,目前似乎只有gcc支持(VC从VC2005开始支持)。要注意的是,printf 的输出格式是括号内左边是字符串,右边是变量,而且右变量与左输出格式是一一对应的。

2) __FILE__ :宏在预编译时会替换成当前的源文件名

3) __LINE__:宏在预编译时会替换成当前的行号

4) __FUNCTION__:宏在预编译时会替换成当前的函数名称

PS:编译过程:

1,扫描解析文件

2,预处理(宏在此时处理,该替换的文字会被替换)

3,对处理过的源代码进行汇编,输出汇编语言的代码(C语言的控制流程被处理)

4,编译为二进制目标文件

5,与程序库进行链接,输出最终的程序文件

(宏 和 C语言在不同的阶段处理执行)

参考官方:http://gcc.gnu.org/onlinedocs/cpp/Macros.html#Macros

在宏定义中,如果要换行,使用“\"符号。然后经预处理后还是在同一行。

使用"##"操作符可以实现宏中token的连接。

资料来源:http://blog.csdn.net/songrotek/article/details/8929963


你可能感兴趣的:(OC宏定义)