C高级day5(Makefile)

news2024/11/26 12:45:54

一、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));  //可以输出hello
    return 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));  //可以输出hello
    printf("%d\n",NUM);  //106
    return 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_t
    TYPE(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.o
    gcc fun.o main.o -o fun
fun.o:fun.c
    gcc -c fun.c -o fun.o
main.o:main.c
    gcc -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.o

clean:
    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.coloradmin.cn/o/1014736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sheetjs實現頁面的數據導出execl

概述 需要給頁面的table做一個數據導出功能,發現一個好用sheetjs工具 只需要簡單的js語法如下,就可以將table的數據導出來 function load(){var date new Date();date.setTime(date.getTime() (8 * 60 * 60 * 1000));var table document.getElementById("tab");v…

神领物流 day02-网关与支付 Spring Cloud Alibaba 微服务

课程安排 单token存在的问题双token三验证用户端token校验与鉴权对接三方支付平台分布式锁 1、场景说明 新入职的你加入了开发一组&#xff0c;也接到了开发任务&#xff0c;并且你也顺利的修复了bug&#xff0c;完成了快递员、司机的鉴权&#xff0c;现在的你已经对项目的业…

C++qt day8

1.用代码实现简单的图形化界面&#xff08;并将工程文件注释&#xff09; 头文件 #ifndef MYWIDGET_H #define MYWIDGET_H //防止头文件冲突#include <QWidget> //父类的头文件class MyWidget : public QWidget //自定义自己的界面类&#xff0c;公共继承…

Linux vim的常见基本操作

目录 vim是一款多模式的编辑器 命令模式下&#xff1a; 用小写英文字母「h」、「j」、「k」、「l」&#xff0c;分别控制光标左、下、上、右移一格 gg&#xff1a;定位到代码第一行 nshiftg 定位到任意一行/最后一行 「 $ 」&#xff1a;移动到光标所在行的结尾 「 ^ 」&…

无涯教程-JavaScript - COLUMNS函数

描述 COLUMNS函数返回数组或引用中的列数。 语法 COLUMNS (array)争论 Argument描述Required/OptionalarrayAn array or array formula, or a reference to a range of cells for which you want the number of Columns.Required Notes COLUMNS(1:1)返回Excel中的列数,即…

字符串解码

题目链接 字符串解码 题目描述 注意点 s 由小写英文字母、数字和方括号 ‘[]’ 组成1 < s.length < 30s 保证是一个 有效 的输入s 中所有整数的取值范围为 [1, 300] 解答思路 利用栈先进后出的特点&#xff0c;将字符存储进栈中创建两个栈&#xff0c;一个数字栈&am…

照片批量处理 7000张

需求&#xff1a; 有6700照片导入系统&#xff1b; 系统只支持500张/每次&#xff1b; 6700 按机构分类复制提取出来&#xff1b; 分批次导入&#xff1b; 6700 分17份复制到对应文件夹中&#xff1b; 照片按照学号命名的&#xff1b; 20231715401.jpg 开始用bat脚本…

Matlab Simulink支持system generator插件

文章目录 前言一、System Generator 简介二、System Generator 特性三、System Generator 安装1、确定是否已安装 System Generator 工具2、vivado 卸载3、vivado 安装 四、解决版本不兼容问题五、使用 System Generator 前言 目前有在 Simulink 中开发完成后将其转换成 Veril…

七天学会C语言-第一天(C语言基本语句)

一、固定格式 这个是C程序的基本框架&#xff0c;需要记住&#xff01;&#xff01;&#xff01; #include<stdio.h>int main(){return 0; }二、printf 语句 简单输出一句C程序&#xff1a; #include<stdio.h> int main(){printf("大家好&#xff0c;&quo…

浅析Java责任链模式实现

一、概要 定义&#xff1a;责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 二、应用场景&#xff1a; 1.多条件流程判断&#xff1a;权限相关…

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测。…

把握经济大势和个人财运密码必须读懂钱—现代金钱的魔力

原出处&#xff1a;天涯论坛之《把握经济大势和个人财运密码必须读懂钱—现代金钱的魔力》 原作者&#xff1a;真立派 原文完整版PDF&#xff08;可能很快就会被河蟹&#xff0c;建议先保存&#xff09;&#xff1a;https://pan.quark.cn/s/20c917683d8f 引子 过去一些年&…

数据结构入门 — 树的概念与结构

本文属于数据结构专栏文章&#xff0c;适合数据结构入门者学习&#xff0c;涵盖数据结构基础的知识和内容体系&#xff0c;文章在介绍数据结构时会配合上动图演示&#xff0c;方便初学者在学习数据结构时理解和学习&#xff0c;了解数据结构系列专栏点击下方链接。 博客主页&am…

【LeetCode-中等题】 151. 反转字符串中的单词

文章目录 题目方法一&#xff1a;双指针去除空格 题目 方法一&#xff1a;双指针去除空格 核心代码去除首尾以及中间多余空格(在原串上修改) //去除首尾以及中间多余空格(在原串上修改)public StringBuilder trimSpaces(String s) { int len s.length();StringBuilder str …

【结构型】代理模式(Proxy)

目录 代理模式(Proxy)适用场景代理模式实例代码&#xff08;Java&#xff09; 代理模式(Proxy) 为其他对象提供一种代理以控制对这个对象的访问。Proxy 模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。 适用场景 远程代理 (Remote Proxy) 为一个对象在不同…

linux-线程条件变量(cond)

概述 与互斥锁不同&#xff0c;条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程&#xff0c;直到某特殊情况发生为止。通常条件变量和互斥锁同时使用 。 条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制&a…

Vue2的学习

computed计算属性 概念 基于现有数据&#xff0c;计算出来的新属性&#xff0c;依赖的数据变化&#xff0c;会自动重新计算 语法 声明在computed配置项中&#xff0c;一个计算属性对应一个函数这是一个属性{{计算属性名}}&#xff0c;不是方法注意不要忘记return <body…

无涯教程-JavaScript - ROW函数

描述 ROW函数返回引用的行号。 语法 ROW ([reference]) 争论 Argument描述Required/OptionalReference 您想要其行号的单元格或单元格范围。 如果省略引用,则假定它是出现ROW函数的单元格的引用。 请参阅下面的注释。 Optional Notes 如果引用是一个单元格范围,并且如果将…

【RTOS学习】单片机中的C语言

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 本喵默认各位小伙伴都会C语言&#xff0c;我们平时学习C语言都是在Windows环境下学习的&#xff0…

事半功倍,必看这4个Pandas神器

Pandas是我们日常处理表格数据最常用的包&#xff0c;但是对于数据分析来说&#xff0c;Pandas的DataFrame还不够直观&#xff0c;所以今天我们将介绍4个和Pandas相关的Python包&#xff0c;可以将Pandas的DataFrame转换交互式表格&#xff0c;让我们可以直接在上面进行数据分析…