1.C 语言中的extern 关键字
extern 是用于表示变量存储类型的关键字。
在C语言中extern 中用于声明静态变量、外部变量和函数,这个变量和函数有可能在本文件(模块)定义,也有可能在其他文件(模块)定义。它告诉编译器变量和函数的定义在其他地方(本文件或者其他文件、库),一般情况而言表示外部变量或者函数定义在其他文件。对于外部变量或者函数,一般在它的头文件中对它进行extern 的声明。
extern 只是用来声明函数或者变量,没有对其进行定义。声明和定义没有先后之分,可以先声明后定义,也可以先定义后声明,定义只有一次,声明可以多次。
程序链接时会寻找extern 修饰的变量的定义,首先会在本地文件中寻找,然后到链接的动态库中寻找。一旦找到变量的定义,就停止寻找。
extern 声明外部变量或者函数,其实就是对外部变量和函数的引用,这样有利于在多文件的程序中共享外部变量和函数。
2.C++中的extern 关键字
extern 的用法和C 语言类似。
extern "C" 声明函数有两种含义
<1>函数是extern 的。
<2>函数需要按照 C 语言的方式进行编译链接,不能按照C++的编译编译链接方式。(C++语言具体多态特性,为了方便函数重载,对编译后的函数的命名有特殊的规定)
和C语言的模块一样,在头文件中,对于外部变量和函数都进行extern 声明。
C 语言中是无法识别extern "C"的,所以在C调用C++的模块的头文件中一般会有如下的语句
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
extern "C"声明函数。
extern "C" void f1();
void f1(){
...
}
extern "C" void f1(){
...
}
extern "C" void f1();
extern "C" void f1(){
}
以上三种写法是等效的,在C++的编译环境中,f1按照C 语言的方式编译链接。
3.对于extern 声明的变量和函数,其关键在于变量和函数本身就是可以被程序的任何文件访问的(静态变量和函数除外),extern 只是用来表示他们具有这种可以被其他地方访问的属性,它将外部变量和函数的引用告诉其他文件。
4.对于动态链接库中的方法,在调用动态连接库的模块中,可以不用extern 进行声明。
extern 是用于表示变量存储类型的关键字。
在C语言中extern 中用于声明静态变量、外部变量和函数,这个变量和函数有可能在本文件(模块)定义,也有可能在其他文件(模块)定义。它告诉编译器变量和函数的定义在其他地方(本文件或者其他文件、库),一般情况而言表示外部变量或者函数定义在其他文件。对于外部变量或者函数,一般在它的头文件中对它进行extern 的声明。
extern 只是用来声明函数或者变量,没有对其进行定义。声明和定义没有先后之分,可以先声明后定义,也可以先定义后声明,定义只有一次,声明可以多次。
程序链接时会寻找extern 修饰的变量的定义,首先会在本地文件中寻找,然后到链接的动态库中寻找。一旦找到变量的定义,就停止寻找。
extern 声明外部变量或者函数,其实就是对外部变量和函数的引用,这样有利于在多文件的程序中共享外部变量和函数。
2.C++中的extern 关键字
extern 的用法和C 语言类似。
extern "C" 声明函数有两种含义
<1>函数是extern 的。
<2>函数需要按照 C 语言的方式进行编译链接,不能按照C++的编译编译链接方式。(C++语言具体多态特性,为了方便函数重载,对编译后的函数的命名有特殊的规定)
和C语言的模块一样,在头文件中,对于外部变量和函数都进行extern 声明。
C 语言中是无法识别extern "C"的,所以在C调用C++的模块的头文件中一般会有如下的语句
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
extern "C"声明函数。
extern "C" void f1();
void f1(){
...
}
extern "C" void f1(){
...
}
extern "C" void f1();
extern "C" void f1(){
}
以上三种写法是等效的,在C++的编译环境中,f1按照C 语言的方式编译链接。
3.对于extern 声明的变量和函数,其关键在于变量和函数本身就是可以被程序的任何文件访问的(静态变量和函数除外),extern 只是用来表示他们具有这种可以被其他地方访问的属性,它将外部变量和函数的引用告诉其他文件。
4.对于动态链接库中的方法,在调用动态连接库的模块中,可以不用extern 进行声明。