链接属性
external属性:
不在代码块中的函数和变量在缺省情况下都属于external链接属性。
具有external属性的变量或者函数在其他源文件中无论被包含多少次,都指向同一个实体。
#a.c
int x;
------------------------------------------------------------------------------------------------
#b.c
int main(void)
{
extern int x;
printf("%d",x);
}
extern关键字
具有external属性表示对外部文件可见,在b.c中通过extern int x 声明变量x来使用a.c中的x变量 。
注意:
1.如果在多个文件中有同名的链接属性为extern的变量,编译器在链接的时候会报错变量重复定义。
2.extern int y,使用了不存在的外部变量,编译器在链接的时候会报错变量未定义。
#a.c
int x;
------------------------------------------------------------------------------------------------
#b.c
int main(void)
{
extern int y;
printf("%d",y);
}
变量或函数允许多次声明,但只允许一次定义。
对于变量凡是没有带 extern 的声明同时也都是定义。
而对函数而言,带有{}是定义,否则是声明。
存储类型
存储类定义 C 程序中变量/函数的的存储位置、生命周期和作用域。
- auto
- static
- register
- extern
auto:
存储位置:内存栈区
生命周期:函数开始时创建,函数结束时销毁 。
作用域:函数内部。
注意:auto关键字只能修饰局部变量,当局部变量存储类型缺省时,该变量的存储类型就是auto,所以一般不显式声明auto。
static:
存储位置:静态区或常量区(.rodata段)
如果是const修饰的放在常量区,非常量放在静态区(已初始化的在.data段,未初始化的在.bss段)
生命周期:程序的整个生命周期内,不会因为进入或者离开他的作用域而创建或者销毁。
作用域:static修饰局部变量在代码块内有效,修饰全局变量在文件内有效。
注意:static修饰的变量只会初始化一次。
#include <stdio.h>
/* 函数声明 */
void func1(void);
static int count=10; /* 全局变量 - static 是默认的 */
int main()
{
while (count--) {
func1();
}
return 0;
}
void func1(void)
{
/* 'thingy' 是 'func1' 的局部变量 - 只初始化一次
* 每次调用函数 'func1' 'thingy' 值不会被重置。
*/
static int thingy=5;
thingy++;
printf(" thingy 为 %d , count 为 %d\n", thingy, count);
}
register:
存储位置:可能位于寄存器,也可能在内存中,这取决于硬件和实现的限制。
生命周期:函数开始时创建,函数结束时销毁 。
作用域:函数内部。
注意:register修饰变量只能是局部变量。
extern:
存储位置:静态区或常量区(.rodata段)
静态区中分为.data段和.bss段,(已初始化的在.data段,未初始化的在.bss段)
生命周期:程序的整个生命周期内 。
作用域:由extern声明的位置决定。
注意:当使用 extern 关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义。
#a.c
int x = 10;
-------------------------------------------------------------------------------------------------
#b.c
#include <stdio.h>
int main(void)
{
extern int x;
printf("x中x = %d",x);
}
void hello(void)
{
/*
*x在此函数中不能访问,x变量的作用域只在声明他的代码块 内有效
*/
x = 10;
}
标签:存储,变量,int,void,函数,extern,链接,属性
From: https://www.cnblogs.com/ljq245055804/p/17353519.html