Lazy loaded image
embedded
c语言-进阶
Words 1092Read Time 3 min
2025-7-10
2025-7-24
type
status
date
slug
summary
tags
category
icon
password

1、宏

1.1 系统中的宏

FILE当前所处文件
LINE当前所处行号
DATE当前所处日期
TIME当前所处时间
TIMESTAMP时间戳

1.2 宏陷阱

宏只是进行替换,替换是在预编译时进行
注意:宏不会考虑运算符优先级的问题,因此我们要给每个参数以及每个表达式都加上括号。

1.3 宏和const常量的对比

宏(#define)和const常量都可以用来定义不可修改的值,但它们在实现机制、编译器处理方式和使用场景上有显著区别。以下是详细的对比:
特性
宏(#define)
const常量
处理阶段
预处理阶段(文本替换)
编译阶段(语言层面的常量)
类型检查
无类型,直接替换
有类型,编译器会检查类型匹配
内存分配
不分配内存(仅是替换)
可能会分配内存(视优化情况而定)
作用域
无作用域,全局替换
遵循变量作用域(块、函数、全局)
调试支持
不可见(替换后消失)
可见(可调试)
是否可修改
不能修改(替换后是字面量)
不能修改(编译时报错)

1.4 #和##

# 运算符用于将宏参数转换为字符串常量。 ## 运算符用于将两个标记连接成一个新的标记。

1.5 assert

断言的用法案例
打印
手搓一个assert

1.6可变参数

引入举例:

2、存储

2.1 存储空间

notion image

2.2 存储类型

auto:
1、只能修饰局部变量,一般省略存储类型会默认为auto
2、修饰的变量存放在栈区
3、初值随机(如果变量不赋初值)
staic:
1、可以修饰变量或函数
2、变量的存放位置在全局区(静态区),如果静态变量有初值(非零),存放.data区没有初值存放在.bss区域
3、限制作用域:
  • 修饰局部变量,和普通局部变量作用域没有区别,但是生命周期被延长为整个程序。也就是在作用函数外有生命但是不能被操作,变成了植物人。
  • 修饰全局变量,限制在本文件中使用。
static的特点:
  • static的本质是延长变量或函数的生命周期,同时限制其作用域。
  • static声明的全局变量、函数,仅当前文件内可用,其他文件不能引用。
  • static在函数内部声明的内部静态变量,只需初始化一次。
  • 而且变量存储在全局数据段(静态存储区)中,而不是栈中,其生命周期持续到程序退出。
4、static修饰函数,限制在本文件中使用
5、值初始化一次(即:该条语句只执行一次),初值赋值为0
extern:
1、extern可以引用其他文件中的全局变量或函数
2、只能修饰全局变量
register:
1、修饰的变量放到寄存器中,如果寄存器满了,被修饰的变量就会默认回到auto类型

3、类型转换

3.1 强制类型转换

(需要转成的类型)要转换的变量

3.2 隐式类型转换

notion image
横向箭头:不管有没有进行混合运算,都会进行转换
纵向箭头:只有进行了混合运算,才会进行转换
注意:char、short会被当作int使用
注意:float会被当做double使用
案例:
notion image

4、union

联合体中的所有成员共享同一块内存,联合体的大小等于最大成员的大小。
场景案例
 
上一篇
码农日记(7月)
下一篇
c语言-指针专题

Comments
Loading...