一.关键字typedef:类型抽象的艺术
typedef的核心功能是为已有类型定义别名,其本质是类型抽象,而非创造新类型,也就是类型重定义。
typedef unsigned int uint;
int main()
{
unsigned int sum1 = 1;
uint sum2 = 0;
return 0;
}
含义:unsigned int 经过typedef重定义之后,等价于uint
误区:typedef 不是类型转换,不能改变变量的类型本质,
二.关键字static:生命周期与作用域的控制者
static关键字通过改变符号的链接属性和存储类型,实现对变量 / 函数的精确控制
1.修饰局部变量
特性:
- 存储在静态存储区(而非栈区)
- 仅初始化一次
- 作用域仍为局部,但生命周期延续到程序结束
void test()
{
int a = 1;
a++;
printf("%d\n", a);
}
int main()
{
int i = 0;
while(i < 10)
{
test();
i++;
}
return 0;
}

此时a变量没有被static修饰,为局部变量,每一次循环过程中出作用域之后会被销毁
void test()
{
static int a = 1;
a++;
printf("%d\n", a);
}
int main()
{
int i = 0;
while(i < 10)
{
test();
i++;
}
return 0;
}

此时a变量被static修饰,为局部变量,每一次循环过程中出作用域之后不会被销毁。
static修饰局部变量时,局部变量出了作用域不销毁。本质上,static修饰局部变量的时候,改变了变量的存储位置(从栈区变到静态区),影响了局部变量的生命周期,生命周期变长的和程序一样长。
2.修饰全局变量
作用:将全局变量的作用域限制为当前文件(内部链接)
// file1.c
static int globalVar = 10; // 仅在file1.c中可见
// file2.c
extern int globalVar; // 编译错误:无法找到该符号
全局变量有外部链接属性,即另一个源文件可以通过extern来声明变量后调用该全局变量。而当static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性,即其他源文件(.c)就不能再使用到这个全局变量了 。
3.修饰函数
作用:将函数的作用域限制为当前文件,常用于实现模块化封装
//test1.c
static int ADD(int x ,int y)
{
return x + y;
}
//test2.c
extern int ADD(int x,int y);
int main()
{
int a = 10;
int b = 20;
int c = ADD(a,b);
printf("%d\n",c);
return 0;
}//编译错误,找不到ADD(int x,int y)
函数具有外部链接属性,static修饰函数时,外部链接属性就变成了内部链接属性,其他源文件就不能再调用这个函数了。
三.#define
#define是 C 语言预处理器指令,用于定义宏。宏可以是简单的常量替换,也可以是带参数的函数式宏。
1.#define定义标识符常量
#define NUM = 10;
int main()
{
printf("%d\n",NUM);//10
int n = NUM;
printf("%d\n", n);//10
int arr[NUM] = {0};
return 0;
}
2.#define定义宏
#define ADD(x,y) ((x)+(y))
int main()
{
int a = 10;
int b = 20;
int c = ADD(a,b);
printf("%d\n",c);
return 0;
}
其中ADD为宏名,x和y为宏参数,((x) +(y))为宏体。
323



被折叠的 条评论
为什么被折叠?



