深入理解C++中变量的存储类别和属性

2020-01-06 13:47:29王冬梅

在main后面定义了全局变量a,b,但由于全局变量定义的位置在函数main之后,因此如果没有程序的第5行,在main函数中是不能引用全局变量a和b的。现在我们在main函数第2行用extern对a和b作了提前引用声明,表示a和b是将在后面定义的变量。这样在main函数中就可以合法地使用全局变量a和b了。如果不作extern声明,编译时会出错,系统认为a和b未经定义。一般都把全局变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern声明。

2) 在多文件的程序中声明外部变量

如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量num,不能分别在两个文件中各自定义一个外部变量num。正确的做法是:在任一个文件中定义外部变量num,而在另一文件中用extern对num作外部变量声明。即

 

 
  1. extern int num; 

编译系统由此知道num是一个已在别处定义的外部变量,它先在本文件中找有无外部变量num,如果有,则将其作用域扩展到本行开始(如上节所述),如果本文件中无此外部变量,则在程序连接时从其他文件中找有无外部变量num,如果有,则把在另一文件中定义的外部变量num的作用域扩展到本文件,在本文件中可以合法地引用该外部变量num。

分析下例:

filel.cpp

 

  1. extern int a,b;  int main() 
  2. {  cout<<a<<","<<b<<end!; 
  3. return 0;  } 
  4.   file2.cpp 
  5. int as3,b=4; 

在源程序文件ffle2.cpp中定义了整型变量a和b,并賦了初值。在filel.cpp中用extern声明外部变量a和b,未賦值。在编译连接成一个程序后,file2.cpp中的a和b的作用域扩展到file2.cpp文件中,因此main函数中的cout语句输出a和b的值为3和4。