但要注意的是,#ifndef可以对重复的代码不进行二次编译,所以main.cpp单元内就不会出现重复定义这个问题,但是到了链接阶段,多个cpp可能同时引入了头文件A,所以把变量的定义或者函数的定义放在头文件中会导致链接阶段重复定义的问题,考虑到这点之后,c++推出了关键字extern用在表示声明变量是外部链接过来的,也叫引用声明,表示当前变量的定义只是一个声明而不是一个定义,所以extern必须用在是外部链接的变量上,具体的定义需要在链接的过程中找到对应文件下的定义。如上述source2头文件的例子,extern int a表明这只是一个变量的声明,并不是在此处定义的,在链接阶段会从对应的.cpp编译的二进制文件中找到变量。所以在头文件中一般只写声明。
//使用new去分配指定的内存int a[20];
int * temp=new (a) int[20];//从数组a的空间中分出一个 int [20]的数组//定位new的好处是可以在频繁需要申请或删除堆内存的时候提高效率//需要注意的地方时//1.定位new没有对应的delete操作,因为它本质也不是申请了一块内存而只是使用//2.它的原型是 new (mem_address+offset) type [size],offset没有设定好,可能导致多个变量使用重叠的内存。
::作用域解析符
空间名称::空间下的变量
如果::前面没有东西的话,就代表是全局变量
using
using声明,就好像将变量放在当前域
namespacejack{int a=5;
}
int main(){
using jack::a;//在main中引入jack的a变量
}
using编译指令,将变量放在当前域的全局域中
namespace jack{
int a=5;
}
int main(){
usingnamespace jack;//在main中引入jack的a变量cout<<a<<endl;
}