一.关键字typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
typedef是C/C++语言中用于创建类型别名的关键字。它可以帮助我们简化复杂的类型声明,并提高代码可读性。
typedef的基本语法如下:
typedef existing_type new_name;
其中,existing_type表示要创建别名的已存在的类型,
new_name表示新的类型别名。
通过将existing_type和new_name结合在一起,并使用typedef关键字,就可以创建一个新的类型别名。
下面是typedef关键字的一些常见用法:
-
类型别名:可以使用typedef为现有的类型创建一个新的别名。例如:
typedef int myInt; myInt num = 5;
这里我们使用typedef为int类型创建了一个新的别名myInt,并将其用于定义变量num。
-
结构体别名:可以使用typedef为结构体类型创建一个新的别名。例如:
typedef struct { int x; int y; } Point; Point p; p.x = 1; p.y = 2;
这里我们使用typedef为一个匿名的结构体类型创建了一个新的别名Point,并定义了一个名为p的结构体变量。
-
函数指针别名:可以使用typedef为函数指针类型创建一个新的别名。例如:
typedef int (*MathFunc)(int, int); int add(int a, int b) { return a + b; } MathFunc func = add; int result = func(1, 2);
这里我们使用typedef为一个带有两个int参数并返回int的函数指针类型创建了一个新的别名MathFunc。然后,我们定义了一个名为add的函数,并将其赋值给func变量。最后,我们调用func函数指针,并将结果赋给result变量。
二.关键字static
在C语言中: static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数
①修饰局部变量
代码一:
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
结果说明 i 生命周期只在作用域
代码二:
#include <stdio.h>
void test()
{
//static修饰局部变量
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
结果如图
对比结果得出
----static修饰局部变量改变了变量的生命周期
----让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
②修饰全局变量
//代码1
//add.c
int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
//代码2
//add.c
static int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
代码1正常,代码2在编译的时候会出现连接性错误。
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使 用。
③修饰函数
与全局变量底层逻辑类似
//代码1
//add.c
int Add(int x, int y)
{
return c+y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
//代码2
//add.c
static int Add(int x, int y)
{
return c+y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
代码1正常,代码2在编译的时候会出现连接性错误
结论:
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
三.#define 定义常量和宏
定义常量的格式为:#define num xxxx (num为一个常量名,xxxx为定义的数值)
定义宏的格式为:#define ADD (x,y) ((x)+(y))
----其中ADD是宏的名字,x 和y是可赋值的参数,最后的式子是其替换到代码的式子。
----在代码中使用ADD时,预处理器会将所有的ADD(a, b)替换为((x)+(y)) 。
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
}
需要注意的是,宏定义是简单的文本替换,没有类型检查和作用域限制。
ps:(网上抄的)在使用宏时,需要注意宏替换所带来的潜在问题,例如宏参数多次被计算、宏定义中的表达式产生副作用等。为了避免这些问题,可以使用括号来明确宏替换的优先级,或者使用内联函数来替代宏定义。