当前位置: 首页 > news >正文

C高级day5(Makefile)

一、Xmind整理:

二、上课笔记整理:

1.#----->把带参宏的参数替换成字符串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX(a,b) a>b?a:b
#define STR(n) #n
int main(int argc, const char *argv[])
{printf("%d\n",MAX(12,3));printf("%s\n",STR(hello));  //可以输出helloreturn 0;
}

2.宏替换

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX(a,b) a>b?a:b
#define STR(n) #n
#define N 10
#define M N+10/3
#define NUM N*M+4/M
int main(int argc, const char *argv[])
{printf("%d\n",MAX(12,3));printf("%s\n",STR(hello));  //可以输出helloprintf("%d\n",NUM);  //106return 0;
}

3.##----->实现字符串的拼接

#include <stdio.h>
#define unit32_t unsigned int
#define TYPE(a,b) a##b       //参数a会和参数b连接到一起
int main(int argc, const char *argv[])
{unit32_t i;    //定义了一个无符号的整形变量i//TYPE(a,b)  --->unit32_tTYPE(unit,32_t) j;    //定义了一个无符号的整形变量j  return 0;
}

4.宏函数练习

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//求最大值的宏函数
#define Max(a,b) {int ret; \if(a>b) \printf("%d\n",a); \else \printf("%d\n",b);\}
#define MAX(a,b) ({int ret; \if(a>b) \ret=a; \else \ret=b;\ret;\100000;\})
int main(int argc, const char *argv[])
{Max(90,100);printf("%d\n",MAX(20,10));return 0;
}

5.使用宏函数,求两数的和,写两种:

a.直接在宏函数中输出结果

b.返回两数相加后的结果,在主函数内使用变量接收,并输出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ADD(a,b) { printf("%d\n",a+b);}#define Add(a,b) ({ int ret=a+b; ret;})
int main(int argc, const char *argv[])
{ADD(90,10);printf("%d\n",Add(100,10));return 0;
}

6.第一版Makefile

#表示Makefile中的注释#这是一个Makefile文件
all:fun        #仅描述了,all这个目标需要依赖于fun文件
#all为了保证一定能生成一个可执行文件fun:fun.o main.ogcc fun.o main.o -o fun
fun.o:fun.cgcc -c fun.c -o fun.o
main.o:main.cgcc -c main.c -o main.o
clean:rm *.o fun

7.第二版Makefile ------>引入变量

变量的赋值方式
=:递归赋值,获取变量最后一次出现的值
+=:追加赋值,把新的值拼接到原有值的后面并且加空格
:=:立即赋值,在哪赋值在哪展开
?=:条件赋值,如果前面没有定义过就赋值否则不赋值变量的访问:$变量名  ${变量名}  $(变量名)

递归赋值

追加赋值

立即赋值

条件赋值

EXE=fun    #可执行文件
OBJs+=fun.o      #所有中间代码文件,由于项目的文件可能会添加或减少,所以OBJs使用追加赋值
OBJs+=main.o
CC=gcc     #CC是一个自动变量,不赋值时make工具会自动推出设备所需的编译器
CFLAGs=-c  #gcc的编译参数all:$(EXE)
$(EXE):${OBJs}$(CC) $(OBJs) -o $(EXE)
fun.o:fun.c$(CC) $(CFLAGs) fun.c -o fun.o
main.o:main.c$(CC) $(CFLAGs) main.c -o main.oclean:rm $(OBJs) $(EXE)

8.第三版Makefile

引入自动变量    ----->针对于一条规则来说的 
$@:所有目标
$^:所有依赖
$<:第一个依赖引入通配符
*:rm *.o
%:模式匹配----->目标和依赖之间的唯一匹配关系%.o:%.c
字符串的模式匹配的流程:
通过xxx.o匹配到xxx.c字符串
由第一条规则展开的OBJs:fun.o  main.o
1、先拿到需要的fun.o文件名,通过模式匹配%匹配到fun
2、%拿到fun后,在%.c位置展开,展开为fun.c模式匹配指的是,使用%,通配掉两个字符串中相同的部分,
如:fun.c和fun.o   fun/fun.的位置就可以通过%匹配
EXE=fun    #可执行文件
OBJs+=fun.o      #所有中间代码文件,由于项目的文件可能会添加或减少,所以OBJs使用追加赋值
OBJs+=main.o
CC=gcc     #CC是一个自动变量,不赋值时make工具会自动推出设备所需的编译器
CFLAGs=-c  #gcc的编译参数all:$(EXE)$(EXE):${OBJs}    #指明一条规则的目标和依赖$(CC) $^ -o $@    #在通过自动变量找到所有的目标和依赖
%.o:%.c$(CC) $(CFLAGs) $^ -o $@
clean:rm $(OBJs) $(EXE)

9.第四版Makefile ---->引入函数

EXE=fun    #可执行文件
Files=$(wildcard *.c)
OBJs=$(patsubst %.c,%.o,$(Files))
CC=gcc     #CC是一个自动变量,不赋值时make工具会自动推出设备所需的编译器
CFLAGs=-c  #gcc的编译参数all:$(EXE)$(EXE):${OBJs}    #指明一条规则的目标和依赖$(CC) $^ -o $@    #在通过自动变量找到所有的目标和依赖
%.o:%.c$(CC) $(CFLAGs) $^ -o $@
clean:rm $(OBJs) $(EXE)

10.伪目标

EXE=fun    #可执行文件
Files=$(wildcard *.c)
OBJs=$(patsubst %.c,%.o,$(Files))
CC=gcc     #CC是一个自动变量,不赋值时make工具会自动推出设备所需的编译器
CFLAGs=-c  #gcc的编译参数all:$(EXE)$(EXE):${OBJs}    #指明一条规则的目标和依赖$(CC) $^ -o $@    #在通过自动变量找到所有的目标和依赖
%.o:%.c$(CC) $(CFLAGs) $^ -o $@.PHONY:clean   #.PHONY表示是一个伪目标
#伪目标的作用,不检查文件时间戳,直接执行规则下的指令
clean:rm $(OBJs) $(EXE)

11.枚举定义

enum 枚举名
{枚举项;
};
//定义了一个枚举的数据类型  使用enum 枚举名定义枚举变量typedef enum 枚举名
{枚举项;
}新的枚举名;    ----->后面可以直接使用新的枚举名定义枚举变量

12.枚举练习

1、假设屋内有三个LED等,分别是LED_1,LED_2,LED_3,

每一个led等分别有两种状态,LED_ON,LED_OFF,

设计程序模拟,灯的初始化,和控制灯状态的函数

(要求:分别初始化三盏灯,每个灯都有两种状态)

写两个函数:

1、led_init(LED ) ---->初始化LED灯的函数,参数是枚举类型

2、led_con(LED,LED_C) ------>控制灯状态的函数,两个参数,分别是LED灯,LED_C灯的状态、

#include <stdio.h>
//定义了一个led灯的枚举类型
typedef enum led
{LED_1=1,LED_2,LED_3,
}LED;typedef enum led_c
{LED_OFF,LED_ON,
}LED_C;//初始化LED灯的函数
void led_init(LED led)
{switch(led){case LED_1:   //直接使用枚举项对枚举变量判断printf("初始化了LED_1灯\n");break;case LED_2:printf("初始化了LED_2灯\n");break;case LED_3:printf("初始化了LED_3灯\n");break;}
}
//控制灯开关的函数
void led_con(LED led,LED_C c)
{switch(led){case LED_1:   //直接使用枚举项对枚举变量判断switch(c){case LED_ON:printf("打开了LED_1灯\n");break;case LED_OFF:printf("关闭了LED_1灯\n");break;}break;case LED_2:switch(c){case LED_ON:printf("打开了LED_2灯\n");break;case LED_OFF:printf("关闭了LED_2灯\n");break;}break;case LED_3:switch(c){case LED_ON:printf("打开了LED_3灯\n");break;case LED_OFF:printf("关闭了LED_3灯\n");break;}    }
}
int main(int argc, const char *argv[])
{LED led = LED_2;//调用初始化函数时,直接使用枚举项进行传参led_init(LED_1);led_init(LED_2);led_init(LED_3);//调用控制函数时,通过枚举变量传参,led是哪一个枚举项,就控制哪一盏灯的状态led_con(led,LED_ON);led_con(led,LED_OFF);return 0;
}
http://www.lryc.cn/news/168571.html

相关文章:

  • Android 系统中适配OAID获取
  • 差分数组leetcode 2770 数组的最大美丽值
  • 请求响应状态码
  • 安卓机型系统美化 Color.xml文件必备常识 自定义颜色资源
  • YOLO物体检测-系列教程1:YOLOV1整体解读(预选框/置信度/分类任/回归任务/损失函数/公式解析/置信度/非极大值抑制)
  • 2023/9/12 -- C++/QT
  • 【Purple Pi OH RK3566鸿蒙开发板】OpenHarmony音频播放应用,真实体验感爆棚!
  • Android rom开发:9.0系统上实现4G wifi 以太网共存
  • 高速自动驾驶HMI人机交互
  • 【自然语言处理】关系抽取 —— SOLS 讲解
  • 周易算卦流程c++实现
  • 软件架构设计(十三) 构件与中间件技术
  • PyTorch深度学习实战——基于ResNet模型实现猫狗分类
  • 机器学习第六课--朴素贝叶斯
  • 基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)
  • 【校招VIP】前端计算机网络之UDP相关
  • 前缀和实例4(和可被k整除的子数组)
  • Android获取系统读取权限
  • 输入学生成绩(最多不超过40),输入为负值时表示输入结束,统计成绩高于平均成绩的学生人数
  • 【力扣周赛】第 363 场周赛(完全平方数和质因数分解)
  • RocketMQ的介绍和环境搭建
  • 【web开发】7、Django(2)
  • Prometheus+Grafana可视化监控【Nginx状态】
  • R 语言的安装教程
  • uniapp-提现功能(demo)
  • Spring 篇
  • three.js简单3D图形的使用
  • spark withColumn的使用(笔记)
  • PTA:7-1 线性表的合并
  • Spring 的创建和日志框架的整合