C语言中,extern关键字怎么使用?最好解释清楚一点。
展开全部
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。
如果你定义A.cpp和B.cpp中都定义了全局变量i。那么分别编译,都可以通过,但是链接时就会报错。
B.obj : error LNK2005: "int i" (?i@@3HA) already defined in A.obj
反之,如果我们希望A.cpp和B.cpp中使用的i是同一个i。也就是两个文件,共同使用同一个全局变量。如果我们不在B.cpp中定义i。那么编译时就会报错,提示
error C2065: 'i' : undeclared identifier
如果我们定义i就会出现上面所说的错误。
于是,我们需要extern关键字。告诉编译器。这个i我们在别的模块中定义过了。你要编译的话,取别的模块找一找。这样程序就能够自动去A.cpp中寻找i的定义。并且让它在B.cpp中可以被使用。
现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。
如果你定义A.cpp和B.cpp中都定义了全局变量i。那么分别编译,都可以通过,但是链接时就会报错。
B.obj : error LNK2005: "int i" (?i@@3HA) already defined in A.obj
反之,如果我们希望A.cpp和B.cpp中使用的i是同一个i。也就是两个文件,共同使用同一个全局变量。如果我们不在B.cpp中定义i。那么编译时就会报错,提示
error C2065: 'i' : undeclared identifier
如果我们定义i就会出现上面所说的错误。
于是,我们需要extern关键字。告诉编译器。这个i我们在别的模块中定义过了。你要编译的话,取别的模块找一找。这样程序就能够自动去A.cpp中寻找i的定义。并且让它在B.cpp中可以被使用。
追问
那在B.cpp中要使用变量 i 时,除了加extern声明外,还需要以头文件的形式把A.cpp包含进去吗,如果不#includes"A.cpp",我试过,程序B.cpp编译时会报错:变量 i 未定义。
追答
你用的是Visual Studio吧。我也试过,在这个编译器里,加不加效果看不出来。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询