C++ extern 的问题

在学C++extern的时候.一个头文件A,和一个源文件B.源文件里在不加extern的时候,也可以访问头文件的对象!那extern的意义是什么?请举例说明!... 在学C++ extern 的时候.一个头文件A,和一个源文件B.源文件里在不加extern的时候,也可以访问头文件的对象!那extern的意义是什么?请举例说明! 展开
 我来答
传薪网络
2015-11-29 · TA获得超过1355个赞
知道小有建树答主
回答量:635
采纳率:92%
帮助的人:244万
展开全部

  extern 表示其后面接的变量或者函数"需要导出"或者"是一个外部的变量或函数"。

  如果有头文件已经声明(采用函数或变量声明的方式),可以无需该关键字

  该关键字是告知编译器,其后面的声明函数或变量来自本文件的外部,最后链接的时候再定位。

  经典的应用场景在动态库导出或者外部变量引入。

  下面是一个动态库导出的示例:

extern "C" int dllfunc();//以C函数接口的方式导出函数dllfunc

  这样编译器在编译代码的时候,就会保留dllfunc的名称信息,方便其他模块调用此函数

  下面是一个外部变量引入的示例:

extern int g_total;//g_total是一个外部的整型变量

  这样编译器在编译本代码的时候,并不会立刻定位g_total的实体位置,而是推迟到link阶段去解决实体位置问题。

  对于函数引用声明,使用extern和不使用,在语法角度上没有本质区别。但是使用extern的函数,其名称信息为保留在生成好的目标文件中,可以被任何第三方使用者看到。

  因此,如果不是有意将其作为接口,请不要使用该关键字,以免影响模块的安全性

  对于变量,则必须要此关键字才能引用外部的变量,否则编译器会在此文件内声明一个同样名称的变量,并可能引发编译错误(同一名称空间中存在两个相同名称的变量)

百度网友4755eb34d
2014-03-21
知道答主
回答量:11
采纳率:0%
帮助的人:9.2万
展开全部
首先,引用百度百科中extern关键字的解释:
【extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。】
我们只探讨前半部分,即【extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义】

假设你在头文件中声明了全局变量int global;,include了该头文件的cpp文件确实可以访问,前提是【只有一个cpp文件include了该头文件】,如果多个源文件中都包含了该头文件,这样的代码是【无法编译通过的】,编译器会报错:找到一个或多个多重定义的符号

报错原因简单来讲可以理解成:【每个cpp文件include的头文件,都等于是写在这个cpp里的代码】,如果是函数、类的声明则没问题(因为声明只说明了原型),但如果是定义(例如你的全局变量global)就会提示多重定义------这时编译器会认为你在两个cpp里分别定义了两个int global,而不是你想象的只有一个int global。

所以,综上所述,如果想在多个cpp中访问同一个全局变量,你的设想是行不通的,这时就要使用extern了。extern的作用是声明一个变量(前提是楼主需要理解声明和定义的区别),并且说明该变量的定义是在其他cpp文件中的,但真实的定义,必须还存在于某个cpp中(下面会说怎么做)。

所以,解决该问题的步骤如下:
1.在头文件中声明extern int global;
2.让所有需要访问该变量的cpp都包含该头文件
3.在任意一个cpp中中定义global(int global;)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_久违Alex
2014-03-20 · TA获得超过223个赞
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:110万
展开全部
指明是扩展变量。
fileA:
#include <stdio.h>
extern void hello(void);

fileB:
#include "fileA"
void hello(void){printf("Hello, world!");}//可以不用再次include<stdio.h>

主要用于大项目的头文件。
举个例子,gnugo的头文件gnugo.h:
/* public functions */
extern void count(int i,
int j,
int color);

extern void countlib(int m,
int n,
int color);

extern void endgame(void);

extern void eval(int color);

extern void examboard(int color);

extern int getij(char move[],
int *i,
int *j);

extern unsigned int findcolor(int i,
int j);
....................
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式