extern
-
被修饰的函数或变量的作用域是整个程序
-
函数或全局变量的声明默认是extern
-
extern一般用于声明一个变量,如果是定义则不需要加此关键字,否则会提示warning
-
extern只用于声明,不带extern修饰的全局变量,是对变量的定义(初始化为默认值),所以当明确声明语义时,就要加上extern修饰,否则会出现重复定义的错误,如:
extern int a; // 声明了一个全局变量 int b; // 声明并定义了一个全局变量,一般初始为0
static
-
static修饰的全局变量或函数的作用域是当前文件
-
当不希望当前函数或全局变量被其他文件可见时,使用static
常见问题
1. 在头文件中声明extern函数或变量
-
一定是在头文件中声明,源文件中去定义,否则当有多个源文件包含该头文件时,就会报重复定义的错误。
-
如果必须要在头文件中声明并定义,请使用static修饰符。
-
extern修饰的全局变量,将在整个程序中被共享。
2. 在头文件中声明并定义static函数或变量
- 当其他源文件包含该头文件时,会产生一个新的内存来存储静态的全局变量,即不与其他文件共享该变量。
3. extern的使用
-
以下是头文件a.h
extern int a; // 声明 extern int func_a(); // 声明
-
以下是源文件a.c
#include "a.h" int a = 1; // 定义 int func_a() // 定义 { return 1; }
-
在源文件b.c中使用
#include "a.h" // extern int a; // 若不包含头文件a.h,则需要在此处声明 // extern int func_a(); // 若不包含头文件a.h,则需要在此处声明 int func_b() { return func_a() + a; }
-
使用a.c中的全局变量和函数时,有两种方式:
-
包含对应的头文件
-
在当前文件声明对应的变量和函数
-
-