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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:这是第三遍读《C语言深度解剖》,想想好像自从大学开始就没读完过几本书,其中谭浩强的那本《C语言程序设计(第四版...
    HavenXie阅读 1,774评论 1 6
  • 重点掌握 3 类对象和方法 对象就是一个物体 类的独特存在就是一个实例,对实例进行操作叫做方法。方法可以应用于类或...
    Coder大雄阅读 1,285评论 0 2
  • 简介 C++98/03的设计目标:一、比C语言更适合系统编程(且与C语言兼容)。二、支持数据抽象。三、支持面向对象...
    认真学计算机阅读 5,351评论 0 53
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,216评论 30 472
  • 文 | 玥茗瑆茜 2017.09.28(01) 又是9月底,又是气温骤降。自毕业至今,不多不少,三年又余。故...
    玥茗瑆茜阅读 213评论 0 0