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;
}
相关文章:
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…...
Android 系统中适配OAID获取
一、OAID概念 OAID(Open Anonymous Identification)是一种匿名身份识别标识符, 用于在移动设备上进行广告追踪和个性化广告投放。它是由中国移动通信集 团、中国电信集团和中国联通集团共同推出的一项行业标准 OAID值为一个64位的数字 二、…...
差分数组leetcode 2770 数组的最大美丽值
什么是差分数组 差分数组是一种数据结构,它存储的是一个数组每个相邻元素的差值。换句话说,给定一个数组arr[],其对应的差分数组diff[]将满足: diff[i] arr[i1] - arr[i] 对于所有 0 < i < n-1 差分数组的作用 用于高效…...
请求响应状态码
请求与响应&状态码 Requests部分 请求行、消息报头、请求正文。 Header解释示例Accept指定客户端能够接收的内容类型Accept: text/plain, text/htmlAccept-Chars et浏览器可以接受的字符编码集。Accept-Charset: iso-8859-5Accept-Encodi ng指定浏览器可以支持的web服务…...
安卓机型系统美化 Color.xml文件必备常识 自定义颜色资源
color.xml文件是Android工程中用来进行颜色资源管理的文件.可以在color.xml文件中通过<color>标签来定义颜色资源.我们在布局文件中、代码中、style定义中或者其他资源文件中,都可以引用之前在color.xml文件中定义的颜色资源。 将color.xml文件拷到res/value…...
YOLO物体检测-系列教程1:YOLOV1整体解读(预选框/置信度/分类任/回归任务/损失函数/公式解析/置信度/非极大值抑制)
🎈🎈🎈YOLO 系列教程 总目录 YOLOV1整体解读 YOLOV2整体解读 YOLOV1提出论文:You Only Look Once: Unified, Real-Time Object Detection 1、物体检测经典方法 two-stage(两阶段):Faster-rc…...
2023/9/12 -- C++/QT
作业 实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性…...
【Purple Pi OH RK3566鸿蒙开发板】OpenHarmony音频播放应用,真实体验感爆棚!
本文转载于Purple Pi OH开发爱好者,作者ITMING 。 原文链接:https://bbs.elecfans.com/jishu_2376383_1_1.html 01注意事项 DevEco Studio 4.0 Beta2(Build Version: 4.0.0.400) OpenHarmony SDK API 9 创建工程类型选择Appli…...
Android rom开发:9.0系统上实现4G wifi 以太网共存
framework层修改网络优先级,4G > wifi > eth 修改patch如下: diff --git a/frameworks/base/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/frameworks/base/services/core/java/com/android/server/connectivit…...
高速自动驾驶HMI人机交互
概述 目的 本文档的目的是描述高速自动驾驶功能涉及的HMI显示需求技术规范和设计说明。 范围 术语及缩写 设计与实验标准 设计标准 设计标准-非法规类设计标准-法规类 HMI交互需求 CL4功能界面 HMI显示器[伊1] 中应包含CL4功能设置界面,提供给用户进行设置操作或显…...
【自然语言处理】关系抽取 —— SOLS 讲解
SOLS 论文信息 标题:Speaker-Oriented Latent Structures for Dialogue-Based Relation Extraction 作者:Guoshun Nan, Guoqing Luo, Sicong Leng, Yao Xiao, Wei Lu 发布时间与更新时间:2021.09.11 主题:自然语言处理、关系抽取、对话场景、跨语句、DialogRE、GCN arXiv:…...
周易算卦流程c++实现
代码 #include<iostream> using namespace std; #include<vector> #include<cstdlib> #include<ctime> #include<Windows.h>int huaYiXiangLiang(int all, int& left) {Sleep(3000);srand(time(0));left rand() % all 1;while (true) {if…...
软件架构设计(十三) 构件与中间件技术
中间件的定义 其实中间件是属于构件的一种。是一种独立的系统软件或服务程序,可以帮助分布式应用软件在不同技术之间共享资源。 我们把它定性为一类系统软件,比如我们常说的消息中间件,数据库中间件等等都是中间件的一种体现。一般情况都是给应用系统提供服务,而不是直接…...
PyTorch深度学习实战——基于ResNet模型实现猫狗分类
PyTorch深度学习实战——基于ResNet模型实现猫狗分类 0. 前言1. ResNet 架构2. 基于预训练 ResNet 模型实现猫狗分类相关链接 0. 前言 从 VGG11 到 VGG19,不同之处仅在于网络层数,一般来说,神经网络越深,它的准确率就越高。但并非…...
机器学习第六课--朴素贝叶斯
朴素贝叶斯广泛地应用在文本分类任务中,其中最为经典的场景为垃圾文本分类(如垃圾邮件分类:给定一个邮件,把它自动分类为垃圾或者正常邮件)。这个任务本身是属于文本分析任务,因为对应的数据均为文本类型,所以对于此类任务我们首先…...
基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)
图书借还管理小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 小…...
【校招VIP】前端计算机网络之UDP相关
考点介绍 UDP是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留UDP 消息的状态。因此,UDP有时被称为不可…...
前缀和实例4(和可被k整除的子数组)
题目: 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1: 输入:nums [4,5,0,-2,-3,1], k 5 输出:7 …...
Android获取系统读取权限
第一步在Androidifest.xml文件中加上授权语句 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/>并且在Application标签下添加 androi…...
输入学生成绩(最多不超过40),输入为负值时表示输入结束,统计成绩高于平均成绩的学生人数
#include<stdio.h> #define N 40 int scanfscore(int score[N]) {int i -1;do {i;printf("输入学生成绩:");scanf("%d", &score[i]);} while (score[i] > 0);return i; } int average(int score[N], int n) {int j 0;int k 0;double sum …...
【力扣周赛】第 363 场周赛(完全平方数和质因数分解)
文章目录 竞赛链接Q1:100031. 计算 K 置位下标对应元素的和竞赛时代码写法2——手写二进制中1的数量 Q2:100040. 让所有学生保持开心的分组方法数(排序后枚举分界)竞赛时代码 Q3:100033. 最大合金数(二分答…...
RocketMQ的介绍和环境搭建
一、介绍 我也不知道是啥,知道有什么用、怎么用就行了,说到mq(MessageQueue)就是消息队列,队列是先进先出的一种数据结构,但是RocketMQ不一定是这样,简单的理解一下,就是临时存储的…...
【web开发】7、Django(2)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、部门列表二、部门管理(增删改)三、用户管理过渡到modelform组件四、modelform实例:靓号操作五、自定义分页组件六、datepick…...
Prometheus+Grafana可视化监控【Nginx状态】
文章目录 一、安装Docker二、安装Nginx(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装nginx_exporter七、Grafana添加Nginx监控模板 一、安装Docker 注意:我这里使用之前写好脚本进行安装Docker,如果已经有D…...
R 语言的安装教程
一、下载相关软件 1、R 下载 官网:R: The R Project for Statistical Computing 找到中国镜像,下载快 历史版本点击这里 2、Rtools 下载 进入镜像后,点击这里 然后选择与上面下载的R版本相对应的版本即可 3、Rstudio 下载 官网࿱…...
uniapp-提现功能(demo)
页面布局 提现页面 有一个输入框 一个提现按钮 一段提现全部的文字 首先用v-model 和data内的数据双向绑定 输入框逻辑分析 输入框的逻辑 为了符合日常输出 所以要对输入框加一些条件限制 因为是提现 所以对输入的字符做筛选,只允许出现小数点和数字 这里用正则实现的小数点…...
Spring 篇
1、什么是 Spring? Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置…...
three.js简单3D图形的使用
npm init vitelatest //创建一个vite的脚手架 选择 Vanilla 之后自己处理一下 在main.js中写入 // 导入three.js import * as THREE from three// 创建场景 const scene new THREE.Scene();// 创建相机 const camera new THREE.PerspectiveCamera(45, //视角window.inner…...
spark withColumn的使用(笔记)
目录 前言: spark withColumn的语法及使用: 准备源数据演示: 完整实例代码: 前言: withColumn():是Apache Spark中用于DataFrame操作的函数之一,它的作用是在DataFrame中添加或替换列ÿ…...
PTA:7-1 线性表的合并
线性表的合并 题目输入样例输出样例 代码解析 题目 输入样例 4 7 5 3 11 3 2 6 3输出样例 7 5 3 11 2 6 代码 #include<iostream> #include<vector> using namespace std;bool checkrep(const vector<int>& arr, int x) {for (int element : arr) {i…...
茂县建设局网站/自制网页
自从软件业诞生后,虚拟世界得以与真实世界并行,二者互相依存,生生不息。软件有一些特殊的属性,与真实世界中的物质的属性不同,有些甚至完全相反,比如: 一. 软件无新旧 在真实世界中,…...
dynamik wordpress/推广普通话黑板报
1) 如果你同时从同一客户插入很多行,使用多个值表的INSERT语句。这比使用分开INSERT语句快(在一些情况中几倍)。 Insert into test values(1,2),(1,3),(1,4)…2) 如果你从不同客户插入很多行,能通过使用INSERT DELAYED语句得到更高的速度。Delayed的含…...
绍兴网站建设哪家好/平台广告推广
返璞归真这几天项目有一个linux下部署数据库的操作,数据库使用python进行初始化安装。然后问题来了,由于linux服务器涉及安全要求,除了代码以来的Python3.6版本外不允许安装其他插件与工具,不巧的是python的代码报错了…如果放在平…...
开发网站 语言/做外贸用什么软件找客户
我们都知道SSD拥有比HDD更快的读写速度,但SATA总线标准却拖累了SSD性能的发挥。好消息是,如今越来越多的笔记本都配备了支持PCI-E总线标准的M.2插槽,这就让更高速的NVMeSSD有了用武之地。 看到这里可能很多童鞋已经泛起了迷糊:啥…...
网站建设服务器篇/教育培训班
String的hashcode()方法 public int hashCode() {int h hash;if (h 0 && value.length > 0) {char val[] value;for (int i 0; i < value.length; i) {h 31 * h val[i];}hash h;}return h;} 选择31是因为可以用移位和减法运算来代替乘法,从而…...
实用写作网站/黄冈黄页88网黄冈房产估价
如果你是前端工程师的话,你应该对 caniuse 这个网站会比较熟悉。 这个网站的作用就是 对 CSS,JS 的一些兼容性问题,并且都从它反馈的兼容性数据中获益,让我们的线上项目更加稳定、和谐的跑在用户电脑里。 简单来说就是因为用户使…...