extern 与 namespace 的用法 C++中extern是什么意思,用法?

extern\u600e\u4e48\u7528\uff1f

extern \u7528\u6765\u5f15\u7528\u672c\u6587\u4ef6\u5916\u7684\u53d8\u91cf\u6216\u8005\u51fd\u6570\u65f6\uff0c\u624d\u7528\u7684\u3002\u5b83\u53ea\u662f\u4e00\u4e2a\u58f0\u660e\uff0c\u4e0d\u662f\u5b9a\u4e49\u3002
\u6bd4\u5982\uff0c\u4f60\u5728\u6587\u4ef6a.h \u4e2d\u5b9a\u4e49\u4e86\uff0cint test;\u8fd9\u4e2a\u53d8\u91cf
\u800c\u4f60\u5728\u6587\u4ef6b.h \u4e2d\uff0c\u5305\u542b\u4e86a.h\u8fd9\u4e2a\u5934\u6587\u4ef6\u4e2d\uff0c\u8fd9\u65f6\u5019\uff0c\u4f60\u8981\u5f15\u7528a.h\u4e2d\u7684\u53d8\u91cf\uff0ctest ,\u65f6\uff0c\u5c31\u5fc5\u987b\u518d\u5728b.h \u4e2d\u58f0\u660e extern int test;
\u8fd9\u6837\uff0c test \u624d\u80fd\u5728b.h \u4e2d\uff0c\u6b63\u786e\u7684\u88ab\u5f15\u7528\uff0c\u4e0d\u7136\u5c31\u4f1a\u53d1\u751f\u9519\u8bef\u3002\u51fd\u6570\u540c\u7406\u3002

extern\u8868\u793a\u58f0\u660e\u4e00\u4e2a\u5728\u5176\u4ed6\u5730\u65b9\u5b9a\u4e49\u8fc7\u7684\u5168\u5c40\u53d8\u91cf\u3002

(a) extern string name; // name\u5728\u5176\u4ed6\u5730\u65b9\u5b9a\u4e49\u4e86\uff08\u901a\u5e38\u662f\u5728\u522b\u7684\u6587\u4ef6\u4e2d\u5b9a\u4e49\u4e86\uff0c\u4f46\u4e5f\u53ef\u4ee5\u662f\u672c\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684\uff09\uff0c\u5728\u8fd9\u4ec5\u4ec5\u662f\u91cd\u65b0\u58f0\u660e\u4e00\u4e0b\uff0c\u4e0d\u4f1a\u91cd\u65b0\u5b9a\u4e49\u4e00\u4e2a\u65b0\u53d8\u91cf\u3002
string name( "exercise 3.5a" ); // \u5b9a\u4e49\u4e86\u4e00\u4e2a\u540d\u4e3aname\u7684\u53d8\u91cf\uff0c\u5e76\u8bbe\u7f6e\u521d\u59cb\u503c\u4e3a"exercise 3.5a"\u3002
(b) extern vector students; // students\u5728\u5176\u4ed6\u5730\u65b9\u5b9a\u4e49\u4e86\uff08\u901a\u5e38\u662f\u5728\u522b\u7684\u6587\u4ef6\u4e2d\u5b9a\u4e49\u4e86\uff0c\u4f46\u4e5f\u53ef\u4ee5\u662f\u672c\u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684\uff09\uff0c\u5728\u8fd9\u4ec5\u4ec5\u662f\u91cd\u65b0\u58f0\u660e\u4e00\u4e0b\uff0c\u4e0d\u4f1a\u91cd\u65b0\u5b9a\u4e49\u4e00\u4e2a\u65b0\u53d8\u91cf\u3002
vector students; // \u5b9a\u4e49\u4e00\u4e2a\u540d\u4e3astudents\u7684\u53d8\u91cf\u3002

/*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。

扩展阅读:xbox seriesx ... examiner 中文翻译 ... www.eeo.cn ... endress ... bioresource technology ... estee lauder ... emirates fly better ... 永恒世界v0.6.2精翻汉化版 ... union官方app下载 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网