extern用法详解(转)

 

1 基本解释   extern可以放置变量或者函数面前,以标示变量或者函数的定义在另外文件中,指示编译器境遇是变量和函数常以任何模块中搜索这定义。
  此外,extern也可用来进展链接指定。

2 问题:extern 变量
  于一个出自文件里定义了一个数组:char a[6];
  于此外一个文书里之所以下列语句举行了注明:extern char *a;
  请问,这样好啊? 
  答案和析:
  1)、不得以,程序运行时会告知您私自访问。原因在于,指向类型T的指针并无对等于类型T的数组。extern
char *a注明的是一个指针变量而休是字符数组,由此和实际的概念不同,从而致使运行时暗访问。应该拿宣示改也extern
char a[ ]。
  2)、例子分析如下,如若a[] = “abcd”,则外部变量a=0x61626364
(abcd的ASCII码值),*a显然没意思
  显明a指向的半空中(0x61626364)没有意思,易并发非法内存访问。
  3)、这指示我们,在使用extern时候要严加对应表明时的格式,在骨子里编程中,这样的错见惯不惊。
  4)、extern用当变量注脚遭时发生这般一个功能,你于*.c文件被宣示了一个大局的变量,那么些全局的变量假设假定吃引述,就坐落*.h中并用extern来声明。

4 问题:extern 函数2
  当函数提供方单方面修改函数原型时,假设使用方不知情继续沿用原来的extern注脚,这样编译时编译器不会师报错。可是以运作过程遭到,因为少了或基本上矣输入参数,往往会照成系统错误,这种气象应什么化解?
  答案和分析:
  时业界对这种状态的处理没有一个怪完善的方案,通常的做法是领取供方在协调之xxx_pub.h中提供针对性标接口的宣示,然后调用方include该头文件,从而省去extern这无异步。以避免那种似是而非。
  宝剑有双锋,对extern的使用,不同的场子当采取不同之做法。

5 问题:extern “C”
  在C++环境下使用C函数的下,平时会冒出编译器无法找到obj模块中之C函数概念,从而导致链接失败的情事,应该怎样化解那种景色为?

  答案和分析:
  C++言语在编译的时以缓解函数的多态问题,会以函数名和参数联合起来别一个中级的函数名称,而C语言虽说非晤面,由此会见招链接时找不至对应函数的情况,此时C函数纵使需要用extern
“C”举行链接指定,这告诉编译器,请保持自身之名,不要让本人转用于链接的中游函数名。
  下边是一个专业的写法:
//在.h文件的峰上
#ifdef __cplusplus
#if __cplusplus
extern “C”{
 #endif
 #endif /* __cplusplus */ 
 …
 …
 //.h文件截止的地点
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */ 

3 问题:extern 函数1
  常常见extern放在函数的前方成为函数宣称的一律组成部分,那么,C语言的根本字extern在函数的讲明遭打什么成效?
  答案和分析:
  如果函数的宣示遭寓关键字extern,仅仅是暗示是函数兴许在另外源文件里定义,没有其余企图。即下述两独函数阐明没有明了的区分:
extern int f(); 和int f();
  当然,这样的用仍然有,就是当程序中替代include “*.h”来声明函数,在有些苛的种受到,我较习惯在备的函数扬言前补加extern修饰。