extern 与 namespace 的用法

extern怎么用?~

extern 用来引用本文件外的变量或者函数时,才用的。它只是一个声明,不是定义。
比如,你在文件a.h 中定义了,int test;这个变量
而你在文件b.h 中,包含了a.h这个头文件中,这时候,你要引用a.h中的变量,test ,时,就必须再在b.h 中声明 extern int test;
这样, test 才能在b.h 中,正确的被引用,不然就会发生错误。函数同理。

extern表示声明一个在其他地方定义过的全局变量。

(a) extern string name; // name在其他地方定义了(通常是在别的文件中定义了,但也可以是本文件中定义的),在这仅仅是重新声明一下,不会重新定义一个新变量。
string name( "exercise 3.5a" ); // 定义了一个名为name的变量,并设置初始值为"exercise 3.5a"。
(b) extern vector students; // students在其他地方定义了(通常是在别的文件中定义了,但也可以是本文件中定义的),在这仅仅是重新声明一下,不会重新定义一个新变量。
vector students; // 定义一个名为students的变量。

/*extern在C和C++中是为了使用全局变量的。
说明变量具有外部链接属性!
在C和C++语言中,使用全局变量有两种方法。
其一:你在一个.cpp文件中定义了一个全局变量,如果你在
别的地方需要使用这个变量你可以用extern 声明
一下,告诉编译器这个变量是在别的.cpp文件定义过的
全局变量。
其二:也是建议用的,就是把在程序中要使用的全局变量放在
头文件中,你只需要在使用的地方用#include把头文件包含进
就可以了。
namespace命名空间是一个逻辑块,可以避免命名冲突。

具体到你这个地方,其实你在namespace data这个命名空间中,
你并没有声明一个变量,你只是用extern int x;告诉编译器
这个int 型的变量x是在别的.cpp文件中定义过的。你给的
那个补充说明也是这么一个意思。
就是在data.cpp
中你定义的int x =1;。这时候你在namespace data 命名空间中操作的
x是在data.cpp中定义的x。这个变量x并不是命名空间data中的,所以就会产生你那个链接错误,找不到符号。这时
你不妨在namespace data 中写一个函数,改写x的值,试试。

你要是想要在namespace data定义x,就得把前面的extern去掉。

在你这个程序中,只需要在main()函数中加上一句extern int x;
程序就可以正常运行,这说明你在main()函数中使用的是在data.cpp文件
中定义的全局变量。
#include<iostream>
#include"data.h"
using std::cout;
using std::endl;
int main()
{
extern int x;
cout<<x<<endl;
return 0;
}

也可以这样修改,
这时候使用的是在namespace data命名空间中定义的
x变量了。
//文件 data.h
namespace data
{
int x=100;
}

主函数文件:
#include<iostream>
#include"data.h"
using std::cout;
using std::endl;
using data::x;
int main()
{
cout<<x<<endl;
return 0;
}

*/

之所以出现连接错误是因为:
在namespace data 中只是对 x 进行了声明,而非定义.即就是说,namespace data 中的int x不是namespace data 中的东西.这里只不过只是对x的一个声明而已,为的是在data中可以引用全局变量x
extern 表明int x只是一个声明,而非定义(告诉编译器这里的x在别的地方)
因为组合较多,下面是一种改法:
//main.cpp
#include<iostream>
#include"data.h"
using std::cout;
using std::endl;
int main()
{
cout<<x<<endl;
return 0;
}

//data.cpp
int x =1;

//data.h
extern int x;

至于namespace 在这里是用不到的:
这是由于如果x是namespace data中的,那么用extern岂不是多此一举(extern int data::x)而且还是错误的用法!
希望能解决你的问题! extern的详细用法见
http://zhidao.baidu.com/question/96882132.html

修改data.cpp文件:
//文件 data.cpp
namespace data
{
int x =1;
}
其余的都不变就可以了。这样x就是namespace data中的数据了,而不是一个所谓的无法解析的外部符号。而且不会因为data.h被包含在了其他的.cpp文件中而发重定义。因为data.h中只是申明x而矣。

1、在C中,给全局变量,函数,加上 static,表示当前函数和变量的linkage 为 internal,这样,就可以在不同的unit 中定义同名的函数和变量了。
但是,加了static 的函数和变量就不用作为模板费类型参数了。(模板的非类型参数,必须是编译期确定的,exterl 性质的,整形常量或者指针常量)
2、在C++中,同样解决这种在不同的编译unit中定义同名的函数和变量的,这样就有了匿名的namespace, C++会为每个匿名的namespace生成一个唯一的 名字: __UNITQUE_NAMESPACE_NAME,并会再定义时后,加上 using namespace __UNITQUE_NAMESPACE_NAME,这样也就就解决了变量和函数名字冲突问题。
这里解决冲突的同时,并不会给函数和变量限定为 internal linkage。

相关兴趣推荐

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网