名称空间的问题:名称多重定义

lixtary 2013-06-18 10:39:42

//file1:head.h
#ifndef HEAD_H
#define HEAD_H
namespace space
{
int i;
void test();
};
#endif



//file2:test.cpp
#include "head.h"
#include <iostream>
void space::test()
{
std::cout<<"using variable cout is ok!";
}



//file3:main.cpp
#include <iostream>
#include "head.h"
int main()
{
space::i=1;
std::cout<<"i="<<space::i;
return 0;
}


三个文件一起编译时提示 int space::i 多重定义。
既然如此,为什么头文件iostream被多个文件包含时,cout可以到处使用?那是怎么实现的呢?
...全文
203 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixtary 2013-06-18
  • 打赏
  • 举报
回复
引用 5 楼 hugett 的回复:
把变量定义放到源文件。。这个跟命名空间没有关系。。就算是全局变量一样是重定义。。
嗯,想明白了,经常看到介绍名称空间的文章中直接int 或double,看习惯了,没想到自己一写就错
hugett 2013-06-18
  • 打赏
  • 举报
回复
把变量定义放到源文件。。这个跟命名空间没有关系。。就算是全局变量一样是重定义。。
ri_aje 2013-06-18
  • 打赏
  • 举报
回复
头文件里面放声明就好了,定义写在实现里面。
橡木疙瘩 2013-06-18
  • 打赏
  • 举报
回复
好久不用全局变量,已经快忘光了。 全局变量声明必须加上extern,否则就是定义。声明可以有很多,但定义只能有一个。

//file1:head.h
#ifndef HEAD_H
#define HEAD_H
namespace space
{
    extern int i;
    void test();
};
#endif
这里编译就会出现“找不到定义”错,然后在test.cpp或main.cpp其中之一加上: int space::i = 0; 就可以了。
橡木疙瘩 2013-06-18
  • 打赏
  • 举报
回复
看不出问题在哪,space::i明明只有声明没有定义,最后还需要由编译器自动生成一个定义。
www_adintr_com 2013-06-18
  • 打赏
  • 举报
回复
鼠标点到 cout 上面, 右键->转到定义 就看到了. 头文件里面用 extern 声明, 在一个 cpp 中进行定义.

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧