day20-c特殊类型和gbd,makefile

day20-linux基础和c




一、结构体:

1. 结构体的嵌套:

结构体里面再放结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
7 #include <stdio.h>
8 typedef struct stu{
9 int age;
10 char name[32];
11 int id;
12 }STU;
13
14 typedef struct tea{
15 int age;
16 char name[32];
17 char sex[32];
18 STU zc;
19 }TEA;
20 int main(int argc, char *argv[])
21 {
22 STU a={12,"zhangsan",45};
23 TEA b={30,"lisi","man",a};
24 printf("a.age=%d\n",a.age);
25 printf("b.zc.age=%d\n",b.zc.age);
26
27 return 0;
28 }

2. 结构体指针

本质是一个指针,只是这个指针指向了一个结构体

一般形式:struct 结构提名 * 指针变量名;

初始化:struct 结构提名 * 指针变量名=结构体地址;

指针访问结构体内容:

两种方式:

1、(*p).成员—用的少

2、p->成员

1
2
3
4
5
6
7
8
9
10
20 int main(int argc, char *argv[])
21 {
22 STU a={12,"zhangsan",45};
23 STU *p=&a;//初始化
24 printf("(*p).age=%d\n",(*p).age);
25 printf("p->age=%d\n",p->age);
26
27 return 0;
28 }

3. 结构体数组:

本质是一个数组,只是这个数组里面的元素都是结构体

一般形式:struct 结构提名 数组名【下标】;

1
2
3
4
5
6
7
8
9
10
20 int main(int argc, char *argv[])
21 {
22 STU a={12,"zhangsan",45};
23 STU b={13,"lisi",47};
24 STU c={15,"wangwu",50};
25 STU s[3]={a,b,c};//初始化
26 printf("s[1].name=%s\n",s[1].name);
27
28 return 0;
29 }



二、共用体—union

也叫联合体

成员们一起用一片空间地址

共用体不允许初始化

STU a={12,”zhangsan”,45};//错误

赋值只能成员赋值,而且每次只能赋值一个,前面赋值的都会被覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
7 #include <stdio.h>
8 #include <string.h>
9 typedef union stu{
10 int age;
11 char name[32];
12 int id;
13 }STU;
14
15 int main(int argc, char *argv[])
16 {
17 STU a;
18 a.age=12;
19 strcpy(a.name,"zhangsan");
20 a.id=45;
21 printf("a.age=%d\n",a.age); //a.age=45
22 printf("a.name=%s\n",a.name); //a.name=-
23 printf("a.id=%d\n",a.id); //a.id=45
24
25 return 0;
26 }

共用体的大小:

也要遵循结构体大小的规则,但是只会给最大成员开辟对应的空间地址




三、枚举型–enum

成员没有初始化,从0开始往后赋值

如果有成员赋值,成员后面依次递增+1

enum里面的成员都是常量,不能修改它们的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
7 #include <stdio.h>
8
9 int main(int argc, char *argv[])
10 {
11 enum {A,E,B=2,C,D=8,F};
12 printf("A=%d\n",A);//0
13 printf("E=%d\n",E);//1
14 printf("B=%d\n",B);//2
15 printf("C=%d\n",C);//3
16 printf("F=%d\n",F);//9
17
18 return 0;
19 }




四、gdb调试工具:

帮助我们找出代码的问题

gcc -g 编译的文件名,会生成一个a.out的执行文件,这个执行文件就可以调试

gdb 执行文件名
gdb 执行文件名 -p 进程号—调试正在运行的程序

r—运行我们的程序
l—查看我们的程序代码
b—设置断点,让程序跑到我们断点的那一行
c–继续运行我们的程序,直到下一个断点,如果没有直接运行完
p+变量===查看变量的值
n—按行运行,但是不进入函数
s—按行运行,会进入函数
delete—删除所有断点
q—退出dgb调试
layout src—查看源代码和调试信息
layout regs—查看寄存器
bt—查看函数调用栈




五、makefile

makefile是一个文件,里面放的是编译的规则,可以管理多个文件

make是一个工具,用来解析我们的makefile

make会根据文件的时间戳进行编译,如果文件的时间戳没有改变,不会编译该文件,节省大量的编译时间

makefile的逻辑:

目标文件:依赖文件

​ (tab)编译语句

目标文件就是我们最终会生成的文件,要生成这个文件,会去找生成它需要的文件,就叫依赖文件,如果这个依赖文件有需要其他文件来生成,继续找它的依赖文件,直到不需要为止

1
2
3
4
5
6
7
8
9
1 app:list.o main.o
2 gcc list.o main.o -o app
3 list.o:list.c
4 gcc -c list.c -o list.o
5 main.o:main.c
6 gcc -c main.c -o main.o
7 clean:
8 rm main.o list.o app

make clean 删除生成的文件(执行clean后面的语句)

make,默认解析当前目录下的makefile或者Makefile

make -f 指定的makefile

调用外部头文件-I 加头文件的路径

1
2
3
4
5
6
7
8
1 app:list.o main.o
2 gcc list.o main.o -I ./include -o app
3 list.o:list.c
4 gcc -c list.c -I ./include -o list.o
5 main.o:main.c
6 gcc -c main.c -I ./include -o main.o
7 clean:
8 rm main.o list.o app

makefile的变量

变量的赋值:

  • =:给当前变量赋值,但是如果后面有新的赋值,把新的赋值给变量
1
2
3
4
5
6
1 a=12
2 b=$(a)
3 a=34
4 all:
5 @echo $(b)
b=34
  • :=—立即赋值,和平时的赋值一样,后面新的赋值不会改变当前值
1
2
3
4
5
6
1 a=12
2 b:=$(a)
3 a=34
4 all:
5 @echo $(b)
b=12
  • ?=—询问赋值,询问前面有没有赋值,如果有,此次赋值无效
1
2
3
4
5
6
7
 1 a=12
2 b:=$(a)
3 a?=34
4 all:
5 @echo $(b)
6 echo $(a)
a=12
  • +=:追加赋值
1
2
3
4
5
6
7
1 a=12
2 b:=$(a)
3 a+=hello
4 all:
5 @echo $(b)
6 echo $(a)
a=12 hello

可以在语句前加@隐藏显示语句

利用变量写makefile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 1 TARGET=app //相当于代替
2 OBJS=list.o main.o
3 CC=gcc
4 OBJS2=list.c
5 OBJS3=main.c
6 PATH=-I ./include
7
8 $(TARGET):$(OBJS)
9 $(CC) $(OBJS) $(PATH) -o $(TARGET)
10 list.o:$(OBJS2)
11 $(CC) -c $(OBJS2) $(PATH) -o list.o
12 main.o:$(OBJS3)
13 $(CC) -c $(OBJS3) $(PATH) -o main.o
14 clean:
15 rm $(OBJS) $(TARGET)
~

特殊的变量:

$@—目标文件
$^—所有依赖文件
$<:第一个依赖文件
通配符:%

1
2
3
4
5
6
7
8
9
10
11
12
TARGET=app
2 OBJS=list.o main.o
3 CC=gcc
4 OBJS2=list.c
5 OBJS3=main.c
6 path=-I ./include
7 $(TARGET):$(OBJS)
8 $(CC) $^ $(path) -o $@
9 %.o:%.c
10 $(CC) -c $^ $(path) -o $@
11 clean:
12 rm $(TARGET) $(OBJS)
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2024 nakano-mahiro
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信