1.作用
(1)放在函数或者变量前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
(2)与“C”连用,作为连接指定。
2.具体解释及示例
2.1.extern的变量和函数声明
extern用于修饰变量或函数,用于声明当前变量或函数可以在本模块或者其他模块中使用。不过要记住的是extern只是声明,而不是定义,也就是说extern并不分配空间。而这个查找的过程是在连接的过程中进行的,因此编译阶段虽然找不到该变量或函数,但是也不会报错。下面用三个例子来看一看。
(1)无extern声明,有变量定义。
stdafx.cpp
- #include "stdafx.h"
- int g_test;
#include "stdafx.h"
int g_test;
main.cpp
- int _tmain(int argc, _TCHAR* argv[])
- {
- g_test=2;
- std::cout<<g_test;
- return 0;
- }
int _tmain(int argc, _TCHAR* argv[])
{
g_test=2;
std::cout<<g_test;
return 0;
}
提示错误,因为此时main中不能调用到g_test。
1>d:\microsoft visual studio 9.0\projects\testcpp\testcpp\testcpp.cpp(25) : error C2065: “g_test”: 未声明的标识符
1>d:\microsoft visual studio 9.0\projects\testcpp\testcpp\testcpp.cpp(26) : error C2065: “g_test”: 未声明的标识符
(2)有extern声明,无变量定义。
stdafx.h
- extern int g_test;
extern int g_test;
main.cpp
- int _tmain(int argc, _TCHAR* argv[])
- {
- g_test=2;
- std::cout<<g_test;
- return 0;
- }
int _tmain(int argc, _TCHAR* argv[])
{
g_test=2;
std::cout<<g_test;
return 0;
}
提示错误,因为extern只是声明,并没有定义,也就没有空间的分配,而这时一个链接错误,编译的时候没办法发现。
1>TestCpp.obj : error LNK2001: 无法解析的外部符号 "int g_test" (?g_test@@3HA)
1>D:\Microsoft Visual Studio 9.0\Projects\TestCpp\Debug\TestCpp.exe : fatal error LNK1120: 1 个无法解析的外部命令
(3)有extern声明,也有变量定义。
stdafx.cpp
- #include "stdafx.h"
- int g_test;
#include "stdafx.h"
int g_test;
- extern int g_test;
extern int g_test;
- int _tmain(int argc, _TCHAR* argv[])
- {
- g_test=2;
- std::cout<<g_test;
- return 0;
- }
int _tmain(int argc, _TCHAR* argv[])
{
g_test=2;
std::cout<<g_test;
return 0;
}
程序执行正常。
2.2.extern "C"
- //在.h文件的头上
- #ifdef __cplusplus
- #if __cplusplus
- extern "C"{
- #endif
- #endif /* __cplusplus */
- …
- …
- //.h文件结束的地方
- #ifdef __cplusplus
- #if __cplusplus
- }
- #endif
- #endif /* __cplusplus */