头文件的全局变量问题

世上的光 2017-09-17 10:18:56
关于头文件中的全局变量问题:
原始的简单代码可以运行成功:
#include <stdlib.h>
#include <iostream>
#include "comA.h"

namespace A{
int x = 2;
void fun(){
std::cout << "A"<<std::endl;
}

}

int x = 3;
int main(void)
{
std::cout<< x <<std::endl;
std::cout<< A::x << std::endl;
A::fun();
system("pause");
return 0;
}

但当我将实现和声明分开写的时候却出现了问题:代码如下:
comA.h
namespace A{
int x = 1;
void fun();
}

comA.cpp
#include "comA.h"
#include <iostream>
void A::fun(){
std::cout << "A"<< std::endl;
}

main.cpp

#include <stdlib.h>
#include <iostream>
#include "comA.h"

int main(void)
{

A::fun();
std::cout << "hello"<<std::endl;
system("pause");
return 0;
}

由于外部变量的冲突,导致链接错误;
1>: fatal error LNK1169: 找到一个或多个多重定义的符号

我想问 如果我就想 按照定义和实现 分离,要如何实现???
...全文
373 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
世上的光 2017-09-20
  • 打赏
  • 举报
回复
引用 9 楼 sty_app 的回复:
7楼正解,楼主头文件没有添加防止重复包含的预编译语句,导致头文件被重复包含了
你好,我觉得 这个和 包含重复预编译并没有关系,重复预编译是 对于一个源文件来讲的
sty_app 2017-09-20
  • 打赏
  • 举报
回复
引用 12 楼 u013555238 的回复:
[quote=引用 9 楼 sty_app 的回复:] 7楼正解,楼主头文件没有添加防止重复包含的预编译语句,导致头文件被重复包含了
你好,我觉得 这个和 包含重复预编译并没有关系,重复预编译是 对于一个源文件来讲的[/quote] 谢谢,我测试了一下代码,确实重复预编译只是针对单个cpp文件,是为了让单个cpp文件编译时重复包含同一个头文件做的保护,跟多cpp没关系 不过作为全局变量,还是不建议在头文件中进行赋值操作,头文件的作用是告诉cpp文件,在程序中存在这个东西(变量、函数、类等) 因此如果头文件进行了内存分配操作,势必会导致包含了该头文件的cpp文件为同一个变量重复分配内存地址,编译期间导致链接出错 7楼给出的extern关键字声明的方法,确保相同的变量名只在一个cpp文件中进行内存分配操作,其他cpp文件同样可以操作这一块内存
世上的光 2017-09-19
  • 打赏
  • 举报
回复
谢谢大家,我明白了
paschen 版主 2017-09-18
  • 打赏
  • 举报
回复
引用 4 楼 u013555238 的回复:
引用 2 楼 paschen 的回复:
全局部变量放到一个源文件中,如int a; 其他地方使用时,全局写上:extern int a; 然后就可以用了
你好,但是如果 一个 全局变量在 一个命名空间中 这时候我应该如何操作??
那extern也放到相应命名空间中
wh_ 2017-09-18
  • 打赏
  • 举报
回复
编译的时候只会编译cpp文件,所以要编译两次,但这两个CPP文件展开后都有那个全局变量,这就重定义,也是链接器报的错误。 所以全局变量只能在一个cpp文件里定义,另外一个cpp文件只能声明。需要指出的是int a;是定义一个全局变量,extern int a;就只是声明一个全局变量。
sty_app 2017-09-18
  • 打赏
  • 举报
回复
7楼正解,楼主头文件没有添加防止重复包含的预编译语句,导致头文件被重复包含了
ztenv 版主 2017-09-18
  • 打赏
  • 举报
回复
引用 3 楼 u013555238 的回复:
引用 1 楼 lianshaohua 的回复:
放到cpp文件中去
你好,您可以说的详细一点么?? 我不太能理解
二楼已作答
棉猴 2017-09-18
  • 打赏
  • 举报
回复
同意以上的说法。 报错的主要原因是ComA.h中命名空间A的变量x被多次定义。因为在主程序中有
#include "comA.h"
而在ComA.cpp中也有
#include "comA.h"
当编译程序时,相当于x被定义了两次。 《C++Primer第四版中文版》中提到 任何在多个文件中使用的变量都需要有与定义分离的声明。 使用extern关键字在ComA.h中声明x,而不是定义x;在ComA.cpp中定义x 变量的 定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程 序中,变量有且仅有一个定义。声明用于向程序表明变量的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它。 在ComA.h中有
namespace A {
	extern int x;//声明x
	void fun();
}
在ComA.cpp中有
#include "ComA.h"
#include <iostream>
void A::fun() {
	std::cout << "A" << std::endl;
}
int A::x = 1;//定义x
paschen 版主 2017-09-17
  • 打赏
  • 举报
回复
全局部变量放到一个源文件中,如int a; 其他地方使用时,全局写上:extern int a; 然后就可以用了
ztenv 版主 2017-09-17
  • 打赏
  • 举报
回复
放到cpp文件中去
大米粥哥哥 2017-09-17
  • 打赏
  • 举报
回复
把变量定义放到cpp int A::x=1; 在命名空间中 extern
世上的光 2017-09-17
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
全局部变量放到一个源文件中,如int a; 其他地方使用时,全局写上:extern int a; 然后就可以用了
你好,但是如果 一个 全局变量在 一个命名空间中 这时候我应该如何操作??
世上的光 2017-09-17
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
放到cpp文件中去
你好,您可以说的详细一点么?? 我不太能理解

64,649

社区成员

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

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