天天看点

C语言知识点总结:预处理指令、宏

预处理指令

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

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

        1)查看预处理过程

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

                    gcc -E code.c -o code.i     把预处理指令存储到code.i预处理文件中

        2)预处理指令分类

                #include 文件包括

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

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

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

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

                #define 定义宏

                宏常量: #define 宏名 数据

                #define MAX 50

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

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

预定义的宏:

                        __func__    获取函数名        %s

                        __FILE__    获取文件名        %s

                        __DATE__    获取当前日期    %s

                        __TIME__    获取当前时间    %s

                         __LINE__    获取当前行号    %d

        1、宏函数:带参数的宏

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

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

                运行步骤

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

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

                注意:定义宏常量、宏函数不能直接换行,可以使用续行符 \ 放在末尾可以换行也可以使用大括号保护代码

        2、宏函数的二义性:

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

                2)避免方法:

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

                        (2)每个参数都加小括号

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

        3、运算符:

                 #   把宏函数的参数变成字符串

                ##  合并两个参数变成标识符

条件编译

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

        2、版本控制:

                        #if

                        #elif

                        #else

                        #endif                      可以使用 #if 0 ................. #endif  对内容进行注释

        3、头文件卫士:防止头文件重复包含

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

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

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

        4、判断、调试代码:

                        #ifdef 宏名(DEBUG)

                        #else

                        #endif

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

        5、封装调试信息函数

#ifdef DEBUG
    #define debug(...) printf(__VA_ARGS__);
#else
    #define debug(...)
#endif
           

        6、封装提示错误信息宏函数

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

继续阅读