extern声明多文件共享变量的方法总结一下:
1).在一个源文件中定义,在其他需要使用的源文件中用extern声明。(仅一处定义,多处extern)
2).在一个源文件中定义,在其对应的头文件中extern声明,在其他需要使用该共享变量的源文件中包含该头文件即可。(更加标准的做法)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在gcc编译器下,分析下列程序
#include<iostream> #include<string.h> using namespace std; int main() { const char str1[]="abc"; const char str2[]="abc"; const char *p1="abc"; const char *p2="abc"; printf("%d %d %d %d ",str1,str2,p1,p2); return 0; }
分析:前两个字符数组,定义在栈上,地址不同。 字符串常量定义在静态区,仅有一份拷贝,所以后面两个指针指向的地址相同。
分析二:
在定义char数组时,会将常量字符串中的值拷贝到字符数组中,因而str1与str2指向的位置不同。但是定义的两个char*指针,p1,p2,都是指向常量区的同一个字符串,因而两者相同。
当把p1,p2改成 &p1,&p2时会发现下列程序的打印结果都是不同的。
#include<iostream> #include<string.h> using namespace std; int main() { const char str1[]="abc"; const char str2[]="abc"; const char *p1="abc"; const char *p2="abc"; printf("%d %d %d %d ",str1,str2,&p1,&p2); return 0; }
因为p1和p2本来就是指针,它们的值(内容)是常量字符串abc的地址,故p1和p2以%d的形式输出是相同的;而&p1和&p2代表的是p1和p2这2个指针的地址.
【p1和p2的内容相同,但存储它们的地方(p1和p2自身的地址)是不同的】