1 / 8
文档名称:

extern.doc

格式:doc   页数:8页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

extern.doc

上传人:012luyin 2016/6/1 文件大小:0 KB

下载得到文件列表

extern.doc

相关文档

文档介绍

文档介绍:extern 变量在一个源文件里定义了一个数组: char a[6]; 在另外一个文件里用下列语句进行了声明: extern char *a; 请问,这样可以吗? 答案与分析: 1) 、不可以,程序运行时会告诉你非法访问。原因在于,指向类型 T 的指针并不等价于类型 T 的数组。 extern char *a 声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为 extern char a[]。 2) 、例子分析如下,如果 a[] = "abcd", 则外部变量 a=0x12345678 (数组的起始地址) ,而*a 是重新定义了一个指针变量 a 的地址可能是 0x87654321, 直接使用*a 是错误的. 3)、这提示我们, 在使用 extern 时候要严格对应声明时的格式, 在实际编程中,这样的错误屡见不鲜。 4)、 extern 用在变量声明中常常有这样一个作用,你在*.c 文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h 中并用 extern 来声明。编辑本段编译、链接 1、声明外部变量现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程,里面含有 和 两个简单的 C++ 源文件: // int i; void main() {} // int i; 这两个文件极为简单,在 中我们定义了一个全局变量 i,在B中我们也定义了一个全局变量 i。我们对 A和B 分别编译, 都可以正常通过编译, 但是进行链接的时候, 却出现了错误,错误提示如下: Linking... : error LNK2005: "int i" (?i@***@3HA) already defined in Debug/ : fatal error LNK1169: one or more multiply defined symbols found Error executing . -2 error(s), 0 warning(s) 这就是说,在编译阶段,各个文件中定义的全局变量相互是透明的, 编译 A 时觉察不到 B 中也定义了 i, 同样, 编译 B 时觉察不到 A 中也定义了 i。但是到了链接阶段, 要将各个文件的内容“合为一体”, 因此, 如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,也就是上面提示的重复定义的错误。因此,各个文件中定义的全局变量名不可相同。在链接阶段,各个文件的内容(实际是编译产生的 obj 文件)是被合并到一起的,因而,定义于某文件内的全局变量,在链接完成后,它的可见范围被扩大到了整个程序。这样一来,按道理说,一个文件中定义的全局变量,可以在整个程序的任何地方被使用,举例说,如果 A 文件中定义了某全局变量,那么 B文件中应可以使用该变量。修改我们的程序,加以验证: // void main() {i= 100; // 试图使用 B 中定义的全局变量} // int i; 编译结果如下: Compiling...