extern一般是使用在多文件之间需要共享某些代码时。
一个c++程序可以包含多个文件,在一个文件中已定义的变量,如果要在另一个文件中调用,就要先声明一下变量,此时用extern这个关键字来声明。
区分是定义还是声明关键在于看计算机是否为变量分配了存储空间。
int num ; //这是定义
extern int num = 1; //这也是定义
extern int num; //这是声明(共享变量)
调用者声明变量使用extern。定义可不要要extern关键字。
变量和函数的定义最好不要在头文件中定义,一般头文件.h 中只声明,不定义,可供多文件调用。如在头文件.h定义,此头文件在其他文件中#include进去后,编译器会认为变量定义了两次,报错。定义一般在单独的头文件的 .cpp 文件中定义。
1、在.h中声明 extern int g_a; 在.c中定义 int g_a=1;
在两个其他文件中引入.h g_a就是唯一的
2、在.h中声明 int g_a; 在.c中定义 int g_a=1;
在两个其他文件中引入.h g_a就是唯一的
头文件dev.cpp函数中定义:
- #include "stdafx.h"
- int i;
1.变量的生明和定义中
C++语言支持分离式编译机制,该机制允许将程序分割为若干个文件,每个文件可被独立编译。为了将程序分为许多文件,则需要在文件中共享代码,例如一个文件的代码可能需要另一个文件中中定义的变量。
为了支持分离式编译,C++允许将声明和定义分离开来。变量的声明规定了变量的类型和名字,即使一个名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。定义则负责创建与名字关联的实体,定义还申请存储空间。
如果想声明一个变量而非定义它,就在变量名前添加extern关键字,而且不要显式地初始化变量:
extern int i; //声明i而非定义
int j; //声明并定义i
但我们也可以给由extern关键字标记的变量赋一个初始值,但这样就不是一个声明了,而是一个定义:
extern int v = 2;
int v = 2; //这两个语句效果完全一样,都是v的定义
注意:
1. 变量能且只能被定义一次,但是可以被声明多次。
2.变量和函数的声明放在头文件中(实验发现前面有没有extern关键字修饰都可以),这样可以让其他模块使用此变量和函数。
在其他引入此头文件的.c或者.cpp文件中,也可以通过加入extern 变量或函数声明,告诉编译器是外部引用。也可以不在声明,直接使用。
C++ 中的变量声明
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。您可以使用 extern 关键字在任何地方声明一个变量。虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
实例
尝试下面的实例,其中,变量在头部就已经被声明,但它们是在主函数内被定义和初始化的:
实例
#include <iostream> using namespace std; // 变量声明 extern int a, b; extern int c; extern float f; int main () { // 变量定义 int a, b; int c; float f; // 实际初始化 a = 10; b = 20; c = a + b; cout << c << endl ; f = 70.0/3.0; cout << f << endl ; return 0; }
当上面的代码被编译和执行时,它会产生下列结果:
30
23.3333
同样的,在函数声明时,提供一个函数名,而函数的实际定义则可以在任何地方进行。例如:
// 函数声明 int func(); int main() { // 函数调用 int i = func(); } // 函数定义 int func() { return 0; }