上面代码中变量i和函数func在文件末尾定义,所以变量需要使用extern关键字告诉编译器,变量在别的地方定义。extern int i我原来以为extern i就可以,结果编译器报错,仔细想下确实应该,否则编译器不知道i是什么类型的数据,又怎么能判断i = 0是否是一个正确的赋值语句呢?
那么定义在其他文件中的函数和变量,如何通过extern关键字调用呢?
首先,定义在其它文件中的函数和变量,可以使用两种方法调用:
一、使用头文件调用,这时候,函数和变量必须在头文件中定义和声明。
二、使用extern关键字调用,这时候函数和变量在.cpp或者.c文件中定义和声明。
看下面两个例子:
devVar.cpp函数中定义:
extern.cpp中
编译工程,程序输出:i = 1,这里使用extern关键字声明在其它cpp文件中定义的变量和函数。
#include <filensme> --- 将filename文件中的内容插入到新的文件中。
deVar.h文件中代码为
函数func修改全局变量i的值并输出。
extern.cpp文件内容为:
程序输出1,2,3,4,5,6,7,8,9,10,这里#include <filname.h> 包含定义在其它头文件中的函数和变量,在来看一个例子。
devVar.cpp文件中内容为:
这样,同样是输出了i= 100。
能够使用extern引用其它cpp文件中定义的函数说明了一个问题:
如果一个工程现编译cpp文件,在把多个目标文件链接成为可执行文件,而两个或多个文件中,定义了相同的全局变量,那么,程序编译的时候不会报错,因为编译器单独编译每个文件,在链接可执行文件的时候,由于多个目标文件中含有相同的全局变量,而生成可执行文件的时候,任何文件中定义的全局变量对其它目标文件都是可见的,此时由于变量定义冲突而发生错误。看下面的代码:
devVar.cpp文件中,内容为:
单独compile任何一个cpp文件都是对的,但是 编译工程,生成可执行文件的时候报错:
1>LINK :
D:\vctest\extern\Debug\extern.exe not found or not built by the last
incremental link; performing full link
1>devVar.obj : error
LNK2005: "int i" (?i@@3HA) already defined in
extern.obj
1>D:\vctest\extern\Debug\extern.exe : fatal error
LNK1169: one or more multiply defined symbols found
原因是:两个.cpp文件中都定义了全局变量i,变量重复定义了。
答案:D
A,外部变量,可供所以源文件使用
B,寄存器变量,放在寄存器而非内存中,效率更高,一般是临时变量
C,自动变量,所有未加 static 关键字的都默认是 auto 变量,也就是我们普通的变量
D,静态变量,在内存中只存在一个,可供当前源文件的所有函数使用