昨遇一个问题。
在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) 命名空间里的函数声明后,定义出体现命名空间。。。