全局函数link error重复定义问题解决


遇一个问题。

在myO.h文件中定义了个全局函数glbFun(),

类A需要用到,#include<myO.h>,

然后,类B需要用到类A,#include<A.h>

这样就会出现link error,glbFun()重复定义&*……%%


开始怀疑,头文件重复包含,各个头文件写成#ifndef #define #endif 情况,问题也没有解决。

后经王大帅哥,建议,将全局函数的的声明和定义分开。声明放在.h, 定义放在.c文件中。

/************************************************************************/
/* myO.h*/
/************************************************************************/
#ifndef MYO_H
#define MYO_H

int globFunc(int a,int b)
{
	return a+b;
}

#endif

/************************************************************************/
/* CA.h                                                                     */
/************************************************************************/
#ifndef CA_H
#define CA_H

#pragma once
#include "myO.h"
//extern int  globFunc(int a,int b);

class CA
{
public:
	CA(void);
	~CA(void);
};

#endif

/************************************************************************/
/* CB.h                                                                     */
/************************************************************************/
#pragma once
#include "A.h"

class CB
{
public:
	CB(void);
	~CB(void);
};

出现:B.obj : error LNK2005: "int __cdecl globFunc(int,int)" (?globFunc@@YAHHH@Z) already defined in A.obj


将myO.h 改成:

/************************************************************************/
/* myO2.h                                                                     */
/************************************************************************/
#ifndef MYO2_H
#define MYO2_H

#pragma once

int globFunc2(int a, int b);


#endif

/************************************************************************/
/* myO2.cpp                                                                     */
/************************************************************************/
#include "myO2.h"

//myO2::myO2(void)
//{
//}
//
//myO2::~myO2(void)
//{
//}

int globFunc2( int a, int b )
{
	return a+b;
}

声明和定义分开,问题消失了。

当然如果函数在命名空间里,定义处也应该写出命名空间

namespace myGlb
{
	int globFunc2(int a, int b);
}

int myGlb::globFunc2( int a, int b )
{
	return a+b;
}



以上经验总结:

1) 头文件,尽量使用#ifndef               #define  #endif 形式。避免头文件重复包含

2)全局函数 ,声明和定义分开,避免重复定义

3) 命名空间里的函数声明后,定义出体现命名空间。。。

                                    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值