Linux 学习记录39(C高级篇)

本文介绍了C语言高级主题,包括使用gdb进行程序调试,详细讲解了如何设置断点、单步执行等。枚举类型的定义和用法也进行了阐述,以及Makefile的原理和编写规则,如分步编译、变量赋值和自动变量等内容,旨在帮助读者理解和掌握Linux环境下的程序开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 学习记录39(C高级篇)

在这里插入图片描述

一、gdb调试工具

用于查找程序中的非语法错误

1. gdb工具的使用

需要在编译时加上参数,生成可以调试的debug的文件

gcc -g xxx.c 生成可以调试的可执行文件
gdb 可执行文件名 进入gdb工具

进入gdb工具后

  1. l:显示我加你前十行,如果我加你超过十行,再按一下l
  2. b 行数/函数名:打断点
  3. r:执行程序默认停在断点处
  4. n:单步执行,遇到函数不会进入函数内部
  5. s :单步执行,遇到函数会进入函数内部
  6. p 变量名 :打印变量
  7. q :退出gdb工具
    在这里插入图片描述

二、枚举类型 enum

1. 定义

enum 类型名
{
	枚举项1,
	枚举项2,
	枚举项3,
	...
	枚举项n,
};

1. 枚举项能直接使用
2. 枚举项默认整形常量
3. 能够给枚举项直接赋值
4. 枚举项值是按顺序递增的
5. 枚举是适用于typedef类型重定义的
6. 枚举一般用于数据间有相互关系并连续的

例:

enum week
{
    mon=1,
    tue,
    wed,
    tus,
    fri,
    sat,
    sum,
};

int main(int argc, char const *argv[])
{
    printf("%d\r\n",mon);
    printf("%d\r\n",tue);
    printf("%d\r\n",wed);
    printf("%d\r\n",tus);
    printf("%d\r\n",fri);
    printf("%d\r\n",sat);
    printf("%d\r\n",sum);
    return 0;
}

在这里插入图片描述
使用场景:用于是v要使用连续的常量,并且每个常量特殊含义的时候

三、Makefile

1. 什么是makefile

Makefile 是一个名为Makefile的工程管理文件
1. Makefile的文件名,可以是大写的Makefile也可以是小写的mkfile,一般使用大写的Makefile
2. 如果大写的Makefile 和 小写的Makefile同时存在,默认执行小写的Makefile
3. Makefile会工具文件的时间戳决定是否需要重新编译

2. 什么是Make

1. make是一个执行Makefile的工具
2. make格式:make 目标
3. make 的执行逻辑:会根据目标自动生成依赖树,通过依赖关系执行整个Makefile文件

3. Make用途

描述工程的执行过程,链接规则
完成自动化编译

4. Makefile的工作过程

一般程序编译分为4步,预处理>编译>汇编>链接
一步编译时,需要联合编译的文件,即使没有修改过也会被重新编译(效率低)
 Makefile一般把文件编译过程分为2步执行
 1. gcc -c 执行汇编操作,生成二进制文件,但是不链接
 2. 从二进制文件链接到库文件,生成可执行文件

(1. Makefile分步编译的目的

1. 一步编译会导致源文件被大量重复编译
2. 只要不链接到库,就会重新生成可执行我加你,每次只重新编译更新过的文件

5. Makefile的语法规则

Makefile主要由规则构成

Makefile由规则,变量,函数和条件编译构成
Makefile中的注释:#

规则由目标,依赖和指令构成

  1. 一条规则可以有多个目标,一个目标可以有多个依赖

  2. 一条规则必须有一个目标,

  3. 目标:依赖

指令 —>指令前面是一个tab键,不能使用4个空格代替
例:

all:../main.out #最后makfile的整体目标

clean:
	rm *.o
#清空文件

../main.out:main.o server.o sqlite.o
	gcc main.o server.o sqlite.o -lpthread -lsqlite3 -o ../main.out 
#生成的最终文件保存至上一级目录

main.o: ../main.c
	gcc -c ../main.c -lpthread -lsqlite3 -o main.o
#生成main.o文件 

server.o: ../server.c
	gcc -c ../server.c -lpthread -o server.o 
#生成server.o文件

sqlite.o: ../sqlite.c
	gcc -c ../sqlite.c -lsqlite3 -o sqlite.o 
#sqlite.o文件

6. Makefile变量的赋值

(1. 递归赋值

=
递归赋值只取最后一次的结果

var1 = 1
var2=$(var1)
var1 = 2
test:
	@echo $(var2)

输出:
在这里插入图片描述

(2. 追加赋值

+=

var1 = 1

var2+=$(var1) 3

test:
	@echo $(var2)

输出
在这里插入图片描述

(3. 立即赋值

+=

var1 = 1
var2:=$(var1) 
var1 = 2
test:
	@echo $(var2)

输出
在这里插入图片描述

(4. 条件赋值

?=
当该变量未被定义十才能被赋值

var1 = 1
var2?=2 
var1?=3
test:
	@echo $(var1)![在这里插入图片描述](https://img-blog.csdnimg.cn/9546dc1db2974918a46914db4c384f0b.png)

	@echo $(var2)

输出:
在这里插入图片描述

6. Makefile自动变量

对于命令而言

变量功能
$@所有目标
$ ^所有依赖
$ <第一个依赖

7. Makefile伪目标

.PHONY
功能:引入为目标可以解决当目标和文件名重复的问题

伪目标后面的要求:
伪目标后面的目标不管目标是文件还是指令,都执行该规则
.PHONY clean

8. Makefile通配符

%:模式匹配符
要求文件名必须同名

%.o:%.c
"自动匹配相同文件名的.c和.o文件"

8. Makefile内置函数

(1. wildcard

使用:$(wildcard 格式)
功能:模式匹配,从当前路径下找到指定格式的内容,找到后不同的内容间以空格作为分隔

$(wildcard *c) 匹配当前路径下所有的.c文件

(2. patsubst

使用:$(patsubst 格式1,格式2,要转换的文件)
功能:将

四、

思维导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值