多重定义C ++

时间:2016-10-27 16:29:50

标签: c++ static linker

好的,已经涵盖了这一点,例如:static array class variable "multiple definition" C++

但我在这里遗漏了一些细节。

我有以下课程: Foo.cpp中

#include <iostream>
#include "Model.h"

    int main(int argc, char** argv){
        std::cout << "hello" << std::endl;
        return 0;
    }

Model.h

#ifndef MODEL_H
#define MODEL_H

#include <string>
#include "md2Loader.h"

class Model{
    public:
    Model();
    Model(const std::string& model_file);

    private:
    md2_header_t header;
    modelData_t model;
};

#endif

Model.cpp

#include "Model.h"
#include "md2Loader.h"

Model::Model(){}

Model::Model(const std::string& model_file){
    model = md2Loader::load_model(model_file);
}

和md2Loader.h

#ifndef MD2LOADER_H
#define MD2LOADER_H

struct modelData_t{
    int numVertices;
    int numTextures;
    // etc
};

struct md2_header_t {
    std::string version;
};

class md2Loader{
public:
    md2Loader(){};
    static modelData_t load_model(const std::string& model_file);
};

modelData_t md2Loader::load_model(const std::string& model_file){
    modelData_t result;
    result.numVertices = 1000;
    result.numTextures = 10;

    return result;
}


#endif

链接器抱怨多个定义。但我不太确定,为什么。 #ifndef,#undefine预处理器指令不起作用吗?我有点认为md2Loader.h包含在Model.cpp和Model.h中。当我在Model.h中执行并离开Model.cpp时,它将编译和链接就好了。我想,预处理器的指令可以防止这种情况发生,但显然我在那里遗漏了一些东西。

1 个答案:

答案 0 :(得分:5)

您需要inline头文件中定义的函数或将其移动到源文件中。因为该功能将出现在多个翻译单元中。

inline modelData_t md2Loader::load_model(const std::string& model_file){
    modelData_t result;
    result.numVertices = 1000;
    result.numTextures = 10;
    return result;
}

详情请见inline specifier

  

只要每个定义出现在不同的翻译单元中,程序中的内联函数或变量(自C ++ 17)可能有多个定义。例如,内联函数或内联变量(自C ++ 17)可以在多个源文件中#include'd的头文件中定义。