企业自建服务器网站建设流程,公司网站运营方案策划,之江汇学校网站建设,外贸网站制作哪家好1.外部变量
如果一个变量除了在定义它的源文件中可以使用外#xff0c;还能被其他文件使用#xff0c;那么就称这个变量为外部变量。命名空间作用域中定义的变量#xff0c;默认情况下都是外部变量#xff0c;但在其他文件中如果需要使用这一变量#xff0c;需要用extern…1.外部变量
如果一个变量除了在定义它的源文件中可以使用外还能被其他文件使用那么就称这个变量为外部变量。命名空间作用域中定义的变量默认情况下都是外部变量但在其他文件中如果需要使用这一变量需要用extern关键字加以声明。请看下面的例子 源文件1如下
int i 3;//定义变量i源文件2如下
extern int i;//声明一个在其他文件中的定义的外部变量iint main()
{i;cout i endl;return 0;
}运行结果 结果分析 上述程序中虽然i定义在源文件1中但由于源文件2中用extern关键字声明了变量i因此在源文件2中同样可以使用它。外部变量是可以为多个源文件所共享的全局变量。
对外部变量的声明可以是定义性声明即在声明的同时定义分配内存初始化也可以是引用性声明引用在别处定义的变量。在命名空间作用域中不用extern关键字声明的变量都是定义性声明用extern关键字声明的变量如果同时指定了初值则是定义性声明否则是引用性声明。
例如上述源文件1中声明变量的同时也是对i的定义源文件2中对i的声明只是引用性声明。外部变量可以有多处声明但对变量的定义性声明只能是唯一的。
2.外部函数
在所有类之外声明的函数也就是非常成员函数都具有命名空间作用域的如果没有特殊说明这样的函数都可以在不同的编译单元中被调用只要在调用之前进行引用性声明即声明函数原型即可。当然也可以在声明函数原型或定义函数时用extern修饰其效果与不加修饰的默认状态是一样的。
【注意】通常情况下变量和函数的定义都放在源文件中而对外部变量和外部函数的引用性声明放在头文件中。
【例】 头文件
#pragma once
extern int i;
extern void next();源文件
int i 3;void other()
{i;
}
void next()
{i;other();
}int main()
{i;next();cout i endl;return 0;
}运行结果
3.将变量和函数限制在编译单元内
命名空间作用域中声明的变量和函数在默认情况下都可以被其他编译单元访问但有时并不希望一个源文件中定义的命名空间作用域的变量和函数被其他源文件引用。这种需求主要出于两个原因一是出于安全性考虑不希望将一个只会在文件内使用的内部变量或函数暴露给其他编译单元就像不希望暴露一个私有成员一样二是对于大工程来说不同文件之中的、只在文件内使用的变量名很容易重名如果将它们都暴露出来在连接时很容易发生名字冲突。
对于这一问题之前的解决办法是在定义这些变量和函数时用static关键字。static关键字用来修饰命名空间作用域的变量和函数时和extern关键字起相反的作用static关键字会使得被static修饰的变量和函数无法被其他编译单元引用。
【注意】static的3中用法当它在局部作用域、类作用域和命名空间作用域时具有不尽相同的作用。一个共同点是凡是被static关键字修饰的变量不管它们在未使用static关键字时它们的生存期如何在被static关键字修饰之后都有静态生存期。
在IOS C 2.0标准中宣布不在鼓励用static关键字解决不把变量和函数暴露给其他编译单元这一问题。取而代之的是使用匿名的命名空间。在匿名命名空间中定义变量和函数都不会暴露给其他编译单元。例
namespace //匿名命名空间
{int i;void f(){i;}
}【注意】应当不希望被其编译单元引用的变量和函数放在匿名命名空间中