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;
        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.cppstatus.cpp中同时include "encode.h"就会报函数DecodeCharArray2Int重定义的错误。

第一个函数没有报错是因为我加了inline,把他变成了内联函数,另一种解决方式是在头文件里面只保留函数声明,而将函数定义也就是函数体放到源文件encode.cpp中。

上面能解决问题的原因如下:
首先,include 一个文件其实就相当于把代码复制过去。所以如果不是内联的,就相当于同名函数有两处定义,所以自然就重定义了
如果是内联的,那么在函数调用的地方,他会将函数展开为多行代码,所以事实上此时是没有函数的,所以不会出现重定义的问题
最后,将函数定义放到cpp文件中,头文件中只存放函数声明,那么当include的时候,其实就是将函数声明粘贴过去了,所以还是只有一处定义,他就在原来的cpp文件中

posted @ 2021-09-26 01:16  胖胖咩  阅读(279)  评论(0)    收藏  举报