C/C++中extern的用法

来源:互联网 发布:php手机号正则表达式 编辑:程序博客网 时间:2024/06/05 04:01

--------------------------------------------------------------------------------

本文属作者原创,如有转载,请注明作者以及原址链接。

谢谢!                                                                                        

---------------------------------------------------------------------------------

1 基本解释:

  extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。以上内容是baidu的。

2 extern用法:

extern都是对全局变量而言的。

当你在main函数中定义了一个变量var时,该变量的作用域就是在main()函数中了,出了这个作用域,var就不起作用了,编译时会出现undefined reference to的错误。如果想将变量var在其他函数或作用域中同样可以使用,可将变量var声明为全局变量,这就用到了extern。

比如:

// test1.cpp int x = 10; // test2.cpp 注意在test2中并没有没有包含test1.cpp #include <iostream> using namespace std; extern int x;int main (){    cout << x << endl;}//输出结果为10 


3 extern需要注意的地方:

当一个extern变量需要在多个cpp文件中引用时,只需在一个地方使用extern声明一下这个全局变量即可,如果在多个文件中同时使用extern进行声明,程序在编译时会出现multiple definition的错误。

A.cpp#inlcude C.hint i;-----------------------B.cpp#include C.hextern int i;-----------------------C.hint i;

4 extern c用法:

C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C,而 extern "C"就是其中的一个策略。C++环境下可以对c的代码进行编译。使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,出现“undefined reference to”的错误,从而导致链接失败的情况。

C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,这是我们就需要使用extern “C”来对C语言的函数进行限定,这时我们告诉编译器,extern "C"修饰的变量和函数是按照C语言方式编译和连接的,不要给我生成用于链接的中间函数;从而就不会出现上述的错误了。

一般我们用下面的代码来对C++和C语言进行区分。

#ifdef __cplusplus  extern "C"{  #endif  C函数/头文件声明;  #ifdef __cplusplus  }

上面这段代码的意思是:

__cpluspluscpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{}来处理其中的C函数/头文件代码.



原创粉丝点击