当前位置:网站首页>标准C语言15
标准C语言15
2022-08-05 06:54:00 【洛cs】
三十五、Makefile
Makefile是由一系列编译指令组成的可执行文本文件,也叫编译脚本;
在终端执行make命令,就会自动执行Makefile脚本文件中的编译指令,它可根据文件最后的修改时间来判断
哪些文件需要重新编译、哪些文件不用重新编译,从而提高效率
编译规则:
1. 如果这个工程没有编译过,那么我们的所有 c 文件都要编译并被链接。
2. 如果这个工程的某几个 c 文件被修改,那么我们只编译被修改的 c 文件,并链接目标程序。
3. 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 c 文件,并链接目标程序。
一个最简单的Makefile格式:
执行目标:依赖
编译指令
被依赖的目标1:依赖文件
编译指令
三十六、结构 struct
结构是一种由程序员自己设计的数据类型,用于描述一个事物的各项特征数据,
有若干个不同的基础类型组成。
设计:
struct 结构类型名
{
类型 成员名1;
...
};
定义结构变量:
struct 结构类型名 结构变量名;
注意:struct在C语言中,定义变量是,不能省略。
struct Student stu; //结构变量
struct Student* sp; //结构指针
定义结构变量并初始化:
顺序:
struct 结构类型名 结构变量名 = {v1,....};
初始化顺序一定要与成员顺序一致
指定:
struct 结构类型名 结构变量名 = {.成员名 = v2,....};
顺序无关
注意:这种赋值方式只能在定义时使用;同类型的结构变量可以直接给另一个初始化。
主体:
相同的结构变量,可以直接初始化
访问成员:
结构变量名.成员名;
由于结构变量的字节数一般都比较大,普通的值传递非常慢,因此传递结构变量的地址,即传递
结构指针变量,用 结构指针变量名->成员名
typedef重定义结构类型名
在C语言中struct enum union 关键字在定义变量不能省略,可以使用typedef进行类型重定义,
typedef struct 结构类型名 结构类型名;
typedef struct 结构类型名
{
/* data */
} 结构类型名;
计算结构体的总字节数:
结构成员顺序会影响总字节数,因此能够在设计结构体时合理安排成员顺序,可以节约内存
内存对齐:
假设:
第一个成员从零开始,存储每个成员的地址编号必须能被该成员的类型字节数整除。
不足填充空白字节。
内存补全:
结构体的总字节数,必须是它最大成员字节数的整数倍,如果不能被整除,最后补空白字节
在Linux、UNIX32位系统下计算结构体的对齐,补全时,成员字节数超过4,则按照4字节对齐补全
windows按实际字节数对齐补齐。
#pragma pack(n) //可以设置按()里的字节补齐,n<4(1,2,4)
注意:结构体适合使用堆内存存储
三十七、联合 union
联合与结构使用方法基本一致,与结构的区别是联合是所有的成员共用一块内存,一个成员的值改变,其他也会改变。
联合的效果就是使用少量的内存对应多个标识符,节约内存,但是现在几乎不使用了
union Data
{
char ch[5];
int num;
};
注意:计算联合总字节时,不需要考虑内存对齐,但要考虑字节补齐
如何判断系统的大小端?
假设:十六进制 0x01020304, 存储在0x0A~0x0D范围的4字节内存中
大端系统:高位数据存储在低位地址 (0x0D:0x04 0x0C:0x03 0x0B:0x02 0x0A:0x01)
小端系统:高位数据存储在高位地址 (0x0D:0x01 0x0C:0x02 0x0B:0x03 0x0A:0x04)
个人计算机一般都是小端系统,而UNIX服务器和网络设备都是大端。
实现一个程序,判断系统大端还是小端
#include <stdio.h>
union Data
{
char ch;
int num;
};
int main(int argc,const char* argv[])
{
union Data d = {d.num = 0x01020304};
printf("%hhd",d.ch);
}
三十八、枚举 enum
枚举就是一种数据类型,把可能出现的所有值罗列出来,并起一个有意义的名字,表示这些值,
除此之外给该类型的变量赋其他值,是非法的(愿望)
枚举可以看做一种值受限制的int类型,但是C编译器为了效率不检查,所有在C中枚举相当于int类型变量。
如果不给成员值,那么枚举中的第一个默认为0;后面加一。如果中间给了值,后面的加一
为什么要使用枚举?
为无意义的值取一个有意义的名字,提高代码的可读性,安全性(与变量相比)
边栏推荐
猜你喜欢
随机推荐
After the firewall iptable rule is enabled, the system network becomes slow
A small problem with mysql using the in function
In the anaconda Promat interface, import torch is passed, and the error is reported in the jupyter notebook (only provide ideas and understanding!)
腾讯业务安全岗 IDP 谈话总结
Cannot compare or sort text, ntext, and image data types
Redis
Mysql master-slave delay reasons and solutions
【 LeetCode 】 235. A binary search tree in recent common ancestor
MySQL:order by排序查询,group by分组查询
线程池的使用(结合Future/Callable使用)
Libpq 是否支持读写分离配置
re正则表达式
UDP组(多)播
【JVM调优】Xms和Xmx为什么要保持一致
Summary of Text Characterization Methods
[Tool Configuration] Summary of Common Uses of VSCode
MySQL: JDBC programming
原来使Maya Arnold也能渲染出高质量作品!超赞小技巧
2022熔化焊接与热切割操作证考试题及模拟考试
Shiny02---Shiny异常解决