extern关键字

1.作用

(1)放在函数或者变量前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。

(2)与“C”连用,作为连接指定。


2.具体解释及示例


2.1.extern的变量和函数声明

extern用于修饰变量或函数,用于声明当前变量或函数可以在本模块或者其他模块中使用。不过要记住的是extern只是声明,而不是定义,也就是说extern并不分配空间。而这个查找的过程是在连接的过程中进行的,因此编译阶段虽然找不到该变量或函数,但是也不会报错。下面用三个例子来看一看。


(1)无extern声明,有变量定义。

stdafx.cpp

  1. #include "stdafx.h" 
  2. int g_test; 
#include "stdafx.h"
int g_test;
main.cpp

  1. int _tmain(int argc, _TCHAR* argv[]) 
  2.     g_test=2; 
  3.     std::cout<<g_test; 
  4.     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

  1. extern int g_test; 
extern int g_test;
main.cpp

  1. int _tmain(int argc, _TCHAR* argv[]) 
  2.     g_test=2; 
  3.     std::cout<<g_test; 
  4.     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

  1. #include "stdafx.h" 
  2. int g_test; 
#include "stdafx.h"
int g_test;
stdafx.h
  1. extern int g_test; 
extern int g_test;
main.cpp
  1. int _tmain(int argc, _TCHAR* argv[]) 
  2.     g_test=2; 
  3.     std::cout<<g_test; 
  4.     return 0; 
int _tmain(int argc, _TCHAR* argv[])
{
	g_test=2;
	std::cout<<g_test;
	return 0;
}
程序执行正常。

2.2.extern "C"

这是个霸气外露的东西啊。好吧,历史遗留问题,最早的标准C编译器编译引用出来的变量和函数就是在名字前面加个下滑杠,比如void foo(int a,int b);编译器引用的函数名是_foo,后来的C编译器都是遵循这个标准。
可是后来C++出现了,他的重载特性使得不同的编译器对它进行了不同的处理,比如void foo(int a,int b);就可能被编译器引用出来后变为_foo_int_int之类的,把函参也放进函数名中,从而实现了重载。为了保证不同厂家生产的模块之间的兼容性,并且可以调用原先开发好的C模块,就引出了一个extern "C"的方法,通过这种定义来告诉编译器:请按照C的方法来对我这个函数进行编译,保持我的名称。这样不同厂家的C和C++中的变量,函数,类就得到了一致化的处理,兼容性也就解决了。

这是一个标准的extern "C"的写法。这在dll的编写上作用很大。
  1. //在.h文件的头上 
  2. #ifdef __cplusplus 
  3. #if __cplusplus 
  4. extern "C"
  5.  #endif 
  6.  #endif /* __cplusplus */  
  7.  … 
  8.  … 
  9.  //.h文件结束的地方 
  10.  #ifdef __cplusplus 
  11.  #if __cplusplus 
  12. #endif 
  13. #endif /* __cplusplus */ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值