C++ extern 的问题
在学C++extern的时候.一个头文件A,和一个源文件B.源文件里在不加extern的时候,也可以访问头文件的对象!那extern的意义是什么?请举例说明!...
在学C++ extern 的时候.一个头文件A,和一个源文件B.源文件里在不加extern的时候,也可以访问头文件的对象!那extern的意义是什么?请举例说明!
展开
3个回答
展开全部
extern 表示其后面接的变量或者函数"需要导出"或者"是一个外部的变量或函数"。
如果有头文件已经声明(采用函数或变量声明的方式),可以无需该关键字
该关键字是告知编译器,其后面的声明函数或变量来自本文件的外部,最后链接的时候再定位。
经典的应用场景在动态库导出或者外部变量引入。
下面是一个动态库导出的示例:
extern "C" int dllfunc();//以C函数接口的方式导出函数dllfunc
这样编译器在编译代码的时候,就会保留dllfunc的名称信息,方便其他模块调用此函数
下面是一个外部变量引入的示例:
extern int g_total;//g_total是一个外部的整型变量
这样编译器在编译本代码的时候,并不会立刻定位g_total的实体位置,而是推迟到link阶段去解决实体位置问题。
对于函数引用声明,使用extern和不使用,在语法角度上没有本质区别。但是使用extern的函数,其名称信息为保留在生成好的目标文件中,可以被任何第三方使用者看到。
因此,如果不是有意将其作为接口,请不要使用该关键字,以免影响模块的安全性
对于变量,则必须要此关键字才能引用外部的变量,否则编译器会在此文件内声明一个同样名称的变量,并可能引发编译错误(同一名称空间中存在两个相同名称的变量)
展开全部
首先,引用百度百科中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;)
【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;)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指明是扩展变量。
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);
....................
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);
....................
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询