当前位置:网站首页>标准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;后面加一。如果中间给了值,后面的加一
为什么要使用枚举?
为无意义的值取一个有意义的名字,提高代码的可读性,安全性(与变量相比)
边栏推荐
- 本地能ping通虚拟机,虚拟机ping不通本地
- 2022 Fusion Welding and Thermal Cutting Operation Certificate Exam Questions and Mock Exams
- typescript61-泛型工具类型(pick)
- Promise (3) async/await
- Flink学习12:DataStreaming API
- Task flow scheduling tool AirFlow,, 220804,,
- 真实字节跳动测试开发面试题,拿下年薪50万offer。
- 2022.7.29好题选讲(计数专题)
- Vulnhub靶机:HA_ NARAK
- Hash these knowledge you should also know
猜你喜欢
In the anaconda Promat interface, import torch is passed, and the error is reported in the jupyter notebook (only provide ideas and understanding!)
MySQL: JDBC programming
Falsely bamboo brother today and found a localization of API to use tools
在STM32中使用printf函数
IO进程线程->进程间的通信->day7
Week 8 Document Clustering(文本聚类)
给网站套上Cloudflare(以腾讯云为例)
合工大苍穹战队视觉组培训Day9——相机标定
cmake 学习使用笔记(三)
TCP的粘包拆包问题+解决方案
随机推荐
UDP broadcast
腾讯实习总结
Flink学习12:DataStreaming API
How to avoid online memory leaks
每月稳定干2万
MySQL:连接查询 | 内连接,外连接
ndk编译so库
Mysql为什么 建立数据库失败
不能比较或排序 text、ntext 和 image 数据类型
Put Cloudflare on the website (take Tencent Cloud as an example)
在anaconda Promat界面import torch通过,在jupyter notebook中报错的问题(仅提供思路理解!)
Summary of Text Characterization Methods
mysql使用in函数的一个小问题
基于快速行进平方法的水面无人船路径规划
性能提升400倍丨外汇掉期估值计算优化案例
ARM Cortex-M上的Trace跟踪方案
Hong Kong International Jewellery Show and Hong Kong International Diamond, Gem and Pearl Show kick off
Redis数据库学习
typescript65-映射类型(keyof)
【动态类型检测 Objective-C】