欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

宏函数、Makefile

程序员文章站 2024-03-23 10:10:16
...

复习:
预处理指令:
C代码不能直接被编译器编译,需要一段程序把它翻译成标准C代码,负责翻译的程序叫预处理器,翻译的过程叫做预处理,被翻译的语句叫做预处理指令,以#开头的都是预处理指令
gcc -E code.c 查看预处理结果
gcc -E code.c -ocode.i 把预处理结果保存到.i文件中

    1、文件包含
    #include 把一个头文件导入到当前文件中
        #include <> 从系统指定目录下查找并导入头文件
        #include "" 先从当前目录下查找头文件,如果找不到,再从系统指定目录查找并导入头文件
        编译参数 -I /路径 来指定头文件的加载路径
        系统指定目录是通过设置环境变量来指定 ~/.bashrc
    
    2、宏常量
    #define 宏名 字面值数据 
    如果在代码中使用了宏,在预处理时会把所有的宏替换成宏名后面的字面值数据
    优点:提高可扩展性、提高可读性、提高安全性、还可以放在case后面
    注意:宏名一般全部大写,末尾不能加分号,不能直接换行(可以使用续行符\)
    预定义好的宏:
        __func__
        __FILE__
        __LINE__
        __DATE__
        __TIME__

3.宏函数
#define FUNC(arg) arg*10
不是真正的函数,其实就是带参数的宏,使用宏函数的位置会被替换成宏函数后面的代码,提供参数会被替换到相应的参数的位置
注意:可以使用续行符和大括号来保护代码

二义性:由于宏所处于的位置或者参数的不同有多种功能,这种叫做宏的二义性,可以在每个参数外加小括号、在最外层加括号,不要使用带自变运算符的参数,降低产生二义性的风险。
    运算符:
        #   把宏函数的参数变成字符串
        ##  合并两个参数变成标识符

4.条件编译
根据条件决定哪些代码是否参与编译
#if#elif#else#ifdef#endif

头文件卫士     防止头文件被重复包含
#ifndef FILENAME_H
#define FILENAME_H

#endif//FILENAME_H

版本控制:
#if VERSON >=3
#elif VERSON >=2
#elif CERSON >=1
#else
#endif

编译器控制:
#if _cplusplus
    printf("C++编译器\n");
#else
    printf("C编译器\n");
#endif;

系统位数判断:
#if _x86_64_
    printf("64位操作系统\n");
#elif _i386_
    printf("32位操作系统\n");
#endif

5.常见的笔试面试题
定义一个100年有多少秒的宏
#define YEAR_SEC (360024365*100u)

在类型重定义时 #define 和typedef的区别?
    
在定义常量时 #define与const的区别?

宏函数与函数的区别?

头文件应该写什么:
问题:头文件可能被任何的源文件包含,意味着头文件的内容会在多个目标文件中存在,合并时不能冲突
重点:头文件中只能编写声明语句,不能有定义语句
全局变量声明
函数声明
宏常量
宏函数
typedef 类型重定义
结构、联合、枚举的类型声明
头文件的编写规则:
1、为每一个.c文件写一个.h文件,.h文件是对.c文件的说明
2、如果需要用到某个.c文件的变量、函数、宏,只需要把他的头文件导入即可。
3、.c文件也需要导入自己的.h文件,目的是为了让声明与定义一致

头文件的相互包含:
假如a.h中包含了b.h的内容,而b.h又需要包含a.h中的内容,这种会导致编译出错

解决方案:把a.h中需要的内容,和b.h中需要的内容提取出来,写成一个c.h

错误:位置的类型名‘xxxx’一般都是因为头文件的相互包含导致的,也可能因为复制粘贴时头文件宏名忘记改

Makefile
Makefile是由一些系列编译指令组成的可执行文件,也叫编译脚本
在终端执行make命令会自动执行Makefile脚本中的编译指令,它可以根据文件的最后修改时间,来判断那些文件需要被编译,哪些文件不需要被编译,从而大大地提高编译效率

编译规则:
    1、如果该项目没有编译过,则编译全部的.c文件,炳链接成可执行文件
    2、如果某些.c文件被修改,则只编译修改过的.c文件,并重新链接新的可执行文件
    3、如果某些.h文件被修改,所有依赖他的.c都需要重新编译并链接

一个最简单的Makefile脚本:
执行目标:依赖
    编译指令
被依赖的目标1:依赖的文件
    编译指令
被依赖的目标2:依赖的文件
    编译指令
    ...
负责清理的执行目标:
    rm...

2048游戏:
文件规则:
main.c 程序入口
game2048.c game2048.h 游戏的主要业务逻辑
direction.c direction.h 方向键处理
tools.c tools.h 工具函数

创建文件的脚本:project_create.sh
     1、    vim project_create.sh
     2、    chmod +x project_create.sh 
     3、    ./project_create.sh
     4、    chmod -x project_create.sh
相关标签: c++