C++ extern声明和 定义问题
extern声明的不定义,又有标识和类型。那不定义的是什么?变量?请大侠指教。我没找到“定义”二字的具体意识是什么。...
extern声明的不定义,又有标识和类型。那不定义的是什么?变量?请大侠指教。我没找到“定义”二字的具体意识是什么。
展开
3个回答
2013-08-11
展开全部
我刚才做了一个实验:
//a.cpp
#include <string>
std::string i;
//b.cpp
#include <iostream>
#include <string>
extern std::string i;
int main ()
{
std::cout << i << std::endl;
}
运行结果为:
(上面是一空行:由于末尾用了endl)
如果没有a.cpp这个文件,运行出错
这是一对实验(有没有a.cpp文件)
可得出这样的结论:
a.cpp中std::string i;是定义(本来就是)
b.cpp中extern std::string i; 则是声明(你的问题)
先别急,这只是实验结果。我们还需要理论依据,那么下面就试着解释一下:
下面是另一个例子(也是第二个实验)
你应该知道内置类型(int等)如果作为全局变量时,定义的同时也就初始化了(一个内置类型有其对应的默认值;如果你将自定义类型也看成内置类型,那么就等于说,一个自定义类型有其对应的默认值(由默认构造函数完成))。如
//c.cpp
int i;
//d.cpp
#include <iostream>
extern int i;
int main ()
{
std::cout << i << std::endl;
}
那么在这里int i; 就是定义(并且初始化了i,初始值为0)
因而输出结果为
0
//这个实验的运行结果符合理论依据。
(我使用的编译器是visual studio 2008)
从这两个实验来看:(将两个“默认”等同起来)
int i;
std::string i;
都可以作为初始化i的定义性语句。
那么
extern int i;
extern std::string i;
也具有定义行为(这个很明显与extern的用法相悖)
在以上两个试验中:int 与 string 有“区别”吗?所有的代码都一样只不过把std::string 换成了 int而已!如果你能解释int的情况,那么我想std::string问题也就迎刃而解了!
于是我个人总结出一个结论:
不论是内置类型还是自定义类型,前面有extern关键字,如果没有显式地初始化参数(即就是自定义类型的默认构造函数被extern屏蔽了,不起初始化的作用),那么就按声明对待。
//a.cpp
#include <string>
std::string i;
//b.cpp
#include <iostream>
#include <string>
extern std::string i;
int main ()
{
std::cout << i << std::endl;
}
运行结果为:
(上面是一空行:由于末尾用了endl)
如果没有a.cpp这个文件,运行出错
这是一对实验(有没有a.cpp文件)
可得出这样的结论:
a.cpp中std::string i;是定义(本来就是)
b.cpp中extern std::string i; 则是声明(你的问题)
先别急,这只是实验结果。我们还需要理论依据,那么下面就试着解释一下:
下面是另一个例子(也是第二个实验)
你应该知道内置类型(int等)如果作为全局变量时,定义的同时也就初始化了(一个内置类型有其对应的默认值;如果你将自定义类型也看成内置类型,那么就等于说,一个自定义类型有其对应的默认值(由默认构造函数完成))。如
//c.cpp
int i;
//d.cpp
#include <iostream>
extern int i;
int main ()
{
std::cout << i << std::endl;
}
那么在这里int i; 就是定义(并且初始化了i,初始值为0)
因而输出结果为
0
//这个实验的运行结果符合理论依据。
(我使用的编译器是visual studio 2008)
从这两个实验来看:(将两个“默认”等同起来)
int i;
std::string i;
都可以作为初始化i的定义性语句。
那么
extern int i;
extern std::string i;
也具有定义行为(这个很明显与extern的用法相悖)
在以上两个试验中:int 与 string 有“区别”吗?所有的代码都一样只不过把std::string 换成了 int而已!如果你能解释int的情况,那么我想std::string问题也就迎刃而解了!
于是我个人总结出一个结论:
不论是内置类型还是自定义类型,前面有extern关键字,如果没有显式地初始化参数(即就是自定义类型的默认构造函数被extern屏蔽了,不起初始化的作用),那么就按声明对待。
2013-08-11
展开全部
全局变量的定义只能有一个,但是声明可以有多个,要想引用这个变量,只要包含它的extern声明就行了。所以:*.C文件中变量的定义,在头文件中是变量的extern声明。别的文件要想引用这个变量,就包含这个头文件,就有了这个变量的声明,就可以直接用了。extern告诉编译器,这只是变量的声明,定义在别的地方,编译器就会去别的地方找这个变量,就不会再一次定义这个变量了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-11
展开全部
extern只是声明这里有个变量,在下面的某的地方,我将要用。内存没有给地址给它,如果你定义了,内存就会分配地址,并且也进行了初始化,就是它有了个值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询