全局变量引发的链接时的LNK2005xxx already defined in yyyy.obj

这几天做项目用到了设计模式中的状态模式,状态是根据事件驱动的,起初在一个GlobalEventName.h文件中定义了所有的事件名,是这种样子:

//事件
const char* CCERinging = "Ringing" ;
const char* CCERelease = "Release" ;
const char* CCEReady = "Ready" ;
const char* CCEDial = "Dialing" ;
const char* CCEEstablish = "Established" ;
const char* CCEHold = "Hold" ;
const char* CCEConsult = "Consult" ;
const char* CCEConference = "Conference" ;
然后在各个状态类的cpp文件中include该GlobalEventName.h文件,例如:

#include "ReadyState.h"
#include "RingState.h"
#include "WaitState.h"
#include "EventHandle.h"
#include "GlobalEventName.h"
#include <iostream>
#include <string>

ReadyState::ReadyState()
{
	std::cout << "进入ReadyState" << std::endl;
}

void ReadyState::Handler(EventHandle *eventHandle) 
{
	std::string eventName = eventHandle->getEventName();
	std::cout << "当前状态为 ReayState, 接收到:" << eventName << std::endl;
	if (0 == eventName.compare(CCERinging))			//接收到振铃事件
	{
		eventHandle->ChangeState(new RingState());
	}
	else if (0 == eventName.compare(CCADial))		//接收到拨号操作
	{
		eventHandle->ChangeState(new WaitState());
	}
	else
	{
		std::cout << "不能处理" << eventName << std::endl;
	}
}
这样在编辑的时候虽然没有,但是在链接时会出现一大堆的error,全部是关于LNK2005,char const * xxx already defined in yyyy.obj,在网友的指导下,指导了错误原因,网友具体描述如下:

头文件中不能包含定义,但可以包含声明;

要是包含定义,那么每个模块包含的时候就会被定义一次,因为这个变量是全局的,所以,链接的时候会导致多个定义,从而产生了该错误

有两种修改方法:

  1. 在GlobalEventName.h文件中,将每个全局变量都声明为static
  2. 在GlobalEventName.h文件中,只是声明,并且在声明的时候加上extern关键字,然后在一个cpp文件中定义这些变量
我使用的是第二种方法,将GlobalEventName.h文件中改为如下内容:
//事件
extern const char* CCERinging;
extern const char* CCERelease;
extern const char* CCEReady;
extern const char* CCEDial;
extern const char* CCEEstablish ;
extern const char* CCEHold;
extern const char* CCEConsult;
extern const char* CCEConference;
然后增加一个GlobalEventName.cpp文件,在该文件中完成定义:
//事件
const char* CCERinging = "Ringing" ;
const char* CCERelease = "Release" ;
const char* CCEReady = "Ready" ;
const char* CCEDial = "Dialing" ;
const char* CCEEstablish = "Established" ;
const char* CCEHold = "Hold" ;
const char* CCEConsult = "Consult" ;
const char* CCEConference = "Conference" ;
这样,在链接的时候,就不会再有这种错误了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值