我是靠谱客的博主 复杂翅膀,最近开发中收集的这篇文章主要介绍预处理指令详解:宏常量、宏函数,条件编译预处理指令宏常量    宏函数区分#define与typedef宏函数与普通函数的区别?条件编译封装调试信息宏函数封装提示错误信息宏函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

预处理指令

        查看预处理过程

        预处理指令的分类

                #include 文件包含

                #define 定义宏

宏常量    

        预定义的宏

宏函数

宏函数的二义性

        如何避免二义性

区分#define与typedef

宏函数与普通函数的区别?

        是什么?

        有什么不一样?

条件编译

        版本控制

        头文件卫士

        判断、调试代码

封装调试信息宏函数

封装提示错误信息宏函数


预处理指令

        程序员所编写的代码并不能被真正的编译器编译,需要一段程序把代码翻译一下

        翻译的过程叫做预处理,负责翻译的程序叫做预处理器,被翻译的代码叫做预处理指令,以#开头的代码都是预处理指令

        查看预处理过程

        gcc -E code.c   把预处理的结果显示到终端上

        gcc -E code.c -o code.i 把与处理结果存储到code.i预处理文件中

        预处理指令的分类

                #include 文件包含

                        #include <> 从系统指定路径查找并导入头文件

                        #include "" 从当前路径下查找,如果找不到再从系统指定路径查找并导入头文件

                        通过编译参数指定查找路径 -I /path

                        操作系统通过设置环境变量来指定头文件的查找路径

                #define 定义宏

                        宏常量

                        宏函数

宏常量    

        #define 宏名 数据

        #define MAX 50

        优点:提高代码可读性、提高代码可扩展性(方便批量修改)、提高安全性、还可以用在case后面

        注意:一般宏名全部大写、末尾不要加分号

        预定义的宏

                __func__        获取函数名

                __FILE__        获取文件名

                __DATE__        获取当前日期

                __TIME__        获取当前时间

                __LINE__        获取当前行号

宏函数

        带参数的宏

        不是真正的函数,不检查参数的类型,没有传参,只是值替换,没有返回值,只有表达式的计算结果

        #define SUM(a,b,c) a+b+c

        1、把代码替换为宏函数后面的表达式代码

        2、把宏函数代码中使用的参数替换为调用者提供的数据

        注意:定义宏常量、宏函数不能直接换行,可以使用续行符  放在末尾可以换行

                也可以使用大括号保护代码

宏函数的二义性

        由于宏函数所处的位置、参数不同导致宏函数有不同的解释和功能,这种叫做宏的二义性

        如何避免二义性

                1、宏函数整体代码加小括号

                2、每个参数都加小括号

                3、使用宏函数时不要提供带自变运算符的变量作为参数

        注意:容易出选择题,例如:哪个宏有二义性、选择出宏函数的结果

区分#define与typedef

(常考的笔试面试题)

        如果是普通类型,它们的功能上没有区别

                #define INT int

                typedef int INT;

        如果是指针类型

                #define INTP int*

                INTP p1,p2,p3;  //p1是指针,p2p3是int类型变量

                typedef int* INTP;

                INTP p1,p2,p3;  //p1p2p3是指针

宏函数与普通函数的区别?

        是什么?

        宏函数:

                不是真正的函数,只是代码替换,用起来像函数

        函数:

                是一段具有某项功能的代码,会被编译成二进制指令存储在代码段中,函数名就是它的首地址,有独立的命名空间、栈空间

        有什么不一样?

        函数:  

                返回值          类型检查        安全        入栈、出栈  速度慢  跳转

        宏函数:

                运算结果        通用                危险        替换                速度快  冗余

条件编译

        根据条件决定让代码是否参与最终的编译

        版本控制

                #if

                #elif

                #else

                #endif

        头文件卫士

                防止头文件重复包含

                #ifndef 宏名(头文件名全大写,_替代.)

                #define 宏名(头文件名全大写,_替代.)

                #endif//宏名(头文件名全大写,_替代.)

                #ifndef HEAD_H

                #define HEAD_H

                int num = 10;

                #endif//HEAD_H

        判断、调试代码

                #ifdef 宏名(DEBUG)

                #else

                #endif

                注意:可以通过编译参数-D宏名 定义宏

封装调试信息宏函数

        #ifdef DEBUG

                #define debug(...) printf(__VA_ARGS__); 

        #else

                #define debug(...)

        #endif

封装提示错误信息宏函数

        #define error(...) printf("%s %s %s %m %d %s %s",__FILE__,__func__,__VA_ARGS__,__LINE__,__DATE__,__TIME__);

练习:实现一个交换两个变量的宏函数,要求尽可能通用,能使用多少种方法

最后

以上就是复杂翅膀为你收集整理的预处理指令详解:宏常量、宏函数,条件编译预处理指令宏常量    宏函数区分#define与typedef宏函数与普通函数的区别?条件编译封装调试信息宏函数封装提示错误信息宏函数的全部内容,希望文章能够帮你解决预处理指令详解:宏常量、宏函数,条件编译预处理指令宏常量    宏函数区分#define与typedef宏函数与普通函数的区别?条件编译封装调试信息宏函数封装提示错误信息宏函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部