C --- 关键字 extern

extern 修饰变量或者函数时表示:该变量或者函数在别的文件中已经定义,提示编译器遇到此变量或者函数的时候在其他模块中寻找其定义。

extern 修饰变量

在一个源文件里定义了一个数组:char a[6];
在另一个源文件里进行引用:extern char a[];

注意:

  1. 在使用 extern 的时候要严格对应声明的类型
  2. extern声明要放在.h文件中,定义放到 .c 中,否则容易引起变量名重定义的错误。
extern 修饰函数

用 extern 修饰函数的声明(注意是声明不是定义),表示这个函数可能在别的源文件中定义

注意:
当 extern 声明的函数定义发生变化之后(传入参数变化),如果使用方并不知情,那么使用方的程序是可以通过编译的,但是在运行的时候会报错(可以尝试用 extern 声明一个函数但是不给定义,在主函数中去调用,这时候编译不会报错,运行时候才会出错)。

另外 extern "C"

c++ 编译器是支持函数/方法重载的,而C编译器不支持,其主要原因是 C++ 编译器对函数名字进行了特殊处理。

比如:
int func(int a, int b); C编译器处理之后声明的签名不变,但是C++处理后可能会变成 int func_int_int_xxxx(int a, int b); 当函数传入参数顺序或者参数个数不同时就不会使函数签名冲突。
因此,在所有 C 的头文件中都应该使用如下声明(注意:只在在C代码头文件中处理):

#ifdef __cplusplus
extern "C"{
#endif /* __cplusplus */ 
// 一系列声明  …
//.h文件结束的地方
#ifdef __cplusplus
}
#endif /* __cplusplus */ 

extern "C" 表示当使用C++编译器处理源文件的时候,要求编译器以C编译器的方式处理。

你可能感兴趣的:(C --- 关键字 extern)