函数的作用域不能是局部的,因为那样的函数无法被外部调用。
函数被调用时,自动变量被存放在栈中,栈中变量的数量随着被调用函数的运行增减,当被调用函数返回后,栈恢复到调用前的状态(自动变量随着函数的返回而消失)。在C++11中,寄存器变量已经失去意义,等于自动变量,保留该关键字只不过是防止使用错误。
自动变量无链接属性,而静态变量有三种:外部、内部、无链接,静态变量的数目在程序运行期间是保持不变的,所以不需要栈来处理静态变量,但是需要一块特定的内存来存储静态变量,如果静态变量未被初始化,则编译器将给其付默认值0,例如一个静态的数组,所有的元素都会被赋值为0。对于静态变量来说,在函数中声明的没有链接属性,在函数外部声明的具有内部链接属性,带有extern修饰符的具有外部链接属性,但是这三者在程序的运行期间一直存在。
自动、寄存器、静态无链接、静态内部链接、静态外部链接形成了五种变量存储方式。
外部变量是在所有的函数外部定义的变量,对于所有的函数来说,其都是外部的,因此可以在main函数之前声明外部变量,在声明之后的所有函数中都可以通过声明然后被当作外部变量使用,因此外部变量又称为全局变量。单定义规则:变量只能被定义一次,其他使用的地方只能声明,注意定义和声明的区别。
//main.cpp
#include <iostream>
using namespace std;
double val = 0.3;
void update(double dt);
void local();
int main()
{
cout<<"global val:"<<val<<endl;
update(0.1);
cout<<"global val:"<<val<<endl;
local();
cout<<"global val:"<<val<<endl;
return 0;
}
//extern.cpp
#include <iostream>
using namespace std;
extern double val;
void update(double dt);
void local();
void update(double dt)
{
extern double val;
val += dt;
cout<<"update global val:"<<val<<endl;
}
void local()
{
double val = 0.8;
cout<<"local val:"<<val<<endl;
cout<<"global val:"<<::val<<endl;
}
内部链接属性
//test1.cpp
#include <iostream>
using namespace std;
int val = 20;
int vald = 3;
static int harry = 300;
void access();
int main()
{
cout <<"val addr:"<< &val << endl;
cout <<"vald addr:"<< &vald << endl;
cout <<"harry addr:"<< &harry << endl;
access();
return 0;
}
//test2.cpp
#include <iostream>
using namespace std;
extern int val;
static int vald = 10;
int harry = 200;
void access()
{
cout <<"val addr:"<< &val << endl;
cout <<"vald addr:"<< &vald << endl;
cout <<"harry addr:"<< &harry << endl;
}
val具有外部属性,在两个文件中操作的是同一个变量,而其他两个都不是,操作的不是用一个变量。
#include <iostream>
using namespace std;
const int size = 10;
void strcount(const char *str);
int main()
{
char input[size];
char next;
cout <<"Enter a line:"<< endl;
cin.get(input,size);
while(cin)
{
cin.get(next);
while(next != '
')
cin.get(next);
strcount(input);
cout <<"Enter a new line:"<< endl;
cin.get(input, size);
}
cout << "bye
";
return 0;
}
void strcount(const char *str)
{
static int total=0;
int count=0;
cout<<"""<<str<<"" contains ";
while(*str++)
count++;
total += count;
cout<<"count:"<<count<<endl;
cout<<"total:"<<total<<endl;
}