<font color = purple>但是我们用static关键字修饰成静态全局变量看看
</font>
说明
<font color = purple>static 修饰全局变量
</font>
改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性
就是这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了
感觉像是作用域变小了
静态函数
static修饰函数和修饰全局变量是一样
<font color = purple>用static修饰函数了之后
</font>
说明:
<font color = purple>用static修饰函数
</font>
static 修饰函数和static修饰全局变量是一样的
函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用的
#define 定义常量和宏
#define 定义常量
#define M 100
int main()
{
int arr[M] = {0};//100*4 = 400
int m = M;
printf("%d\n", sizeof(arr));//400
printf("%d\n", M);
printf("%d\n", m);
return 0;
}
这里#define 定义的是M这个标识符常量
以后我们在碰到M的时候编译器在编译期间,就会自动替换为常量100。
通常在定义数组时使用或者重复值时。
#define 定义宏
<font color = Orange>我们来看一下宏是怎么定义的:</font>
<font color = Orange>和定义函数非常相识</font>
<font color = red>但是宏没有函数的==返回类型==和==参数类型==</font>
<font color = red>还是很不一样的,宏的实现体一般都是表达式</font>
那么宏是怎么调用的呢?和函数有什么区别嘞?
//宏
#define ADD(x, y) ((x)+(y))
//函数
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);
//int c = (a)+(b);
printf("%d\n", c);
int d = Add(a, b);
printf("%d\n", d);
return 0;
}
<font color = purple>我们可以看到宏的调用也和函数产不多</font>
但是
int c = ADD(a, b);这段代码调用宏的本质是替换
int c = (a)+(b);在编译的时候就把ADD这个宏替换成这样
</br>
而函数调用是
把实参传到函数形参里面进行计算,然后在返回值
关键字 typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
示例:
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
<font color = purple>但是我们用static关键字修饰成静态全局变量看看
</font>
说明
<font color = purple>static 修饰全局变量
</font>
改变了这个全局变量的链接属性,由外边链接属性变成了内部链接属性
就是这个静态变量只能在自己所在的源文件内部使用,不能在其他源文件内部使用了
感觉像是作用域变小了
静态函数
static修饰函数和修饰全局变量是一样
<font color = purple>用static修饰函数了之后
</font>
说明:
<font color = purple>用static修饰函数
</font>
static 修饰函数和static修饰全局变量是一样的
函数是具有外部链接属性的,但是被static修饰,就变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用的
#define 定义常量和宏
#define 定义常量
#define M 100
int main()
{
int arr[M] = {0};//100*4 = 400
int m = M;
printf("%d\n", sizeof(arr));//400
printf("%d\n", M);
printf("%d\n", m);
return 0;
}
这里#define 定义的是M这个标识符常量
以后我们在碰到M的时候编译器在编译期间,就会自动替换为常量100。
通常在定义数组时使用或者重复值时。
#define 定义宏
<font color = Orange>我们来看一下宏是怎么定义的:</font>
<font color = Orange>和定义函数非常相识</font>
<font color = red>但是宏没有函数的==返回类型==和==参数类型==</font>
<font color = red>还是很不一样的,宏的实现体一般都是表达式</font>
那么宏是怎么调用的呢?和函数有什么区别嘞?
//宏
#define ADD(x, y) ((x)+(y))
//函数
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);
//int c = (a)+(b);
printf("%d\n", c);
int d = Add(a, b);
printf("%d\n", d);
return 0;
}
<font color = purple>我们可以看到宏的调用也和函数产不多</font>
但是
int c = ADD(a, b);这段代码调用宏的本质是替换
int c = (a)+(b);在编译的时候就把ADD这个宏替换成这样
</br>
而函数调用是
把实参传到函数形参里面进行计算,然后在返回值
关键字 typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
示例:
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}