multiple definition of的问题
今天写代码遇到一个重定义的问题,我的代码目录如下
├── store_node
│ ├── CMakeLists.txt
│ ├── config
│ │ └── config.ini
│ ├── init
│ │ ├── statusdb.cpp
│ │ └── statusdb.h
│ ├── main.cpp
│
│
│
└── utils
├── CMakeLists.txt
├── encode
│ ├── encode.cpp
│ └── encode.h
我的encode.h的内容如下:
#ifndef __ENCODE_H__
#define __ENCODE_H__
#include <cstdint>
namespace glib{
// void EncodeInt2CharArray(char* dst,uint32_t num);
inline void EncodeInt2CharArray(char* dst,uint32_t num){
for(int i=0;i<4;++i){
*(dst++)=0xFF#
num>>=8;
}
}
uint32_t DecodeCharArray2Int(char* src){
uint32_t res=0;
for(int i=0;i<4;++i){
int step=8;
res=res | (*(src+i)&0xFF)<<step*i;
}
return res;
}
}
#endif
然后在main.cpp和status.cpp中同时include "encode.h"就会报函数DecodeCharArray2Int重定义的错误。
第一个函数没有报错是因为我加了inline,把他变成了内联函数,另一种解决方式是在头文件里面只保留函数声明,而将函数定义也就是函数体放到源文件encode.cpp中。
上面能解决问题的原因如下:
首先,include 一个文件其实就相当于把代码复制过去。所以如果不是内联的,就相当于同名函数有两处定义,所以自然就重定义了
如果是内联的,那么在函数调用的地方,他会将函数展开为多行代码,所以事实上此时是没有函数的,所以不会出现重定义的问题
最后,将函数定义放到cpp文件中,头文件中只存放函数声明,那么当include的时候,其实就是将函数声明粘贴过去了,所以还是只有一处定义,他就在原来的cpp文件中
浙公网安备 33010602011771号