C++ 多定义C++;

C++ 多定义C++;,c++,static,linker,C++,Static,Linker,好的,这已经包括在内了,例如: 但我在这里遗漏了一些细节 我有以下课程: Foo.cpp 和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

好的,这已经包括在内了,例如:

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

我有以下课程: Foo.cpp

和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,#define预处理器指令没有帮助吗?我有点理解md2Loader.h同时包含在Model.cpp和Model.h中。当我在Model.h中进行实现并离开Model.cpp时,它将很好地编译和链接。我认为,预处理器的指令阻止了这种情况的发生,但显然我遗漏了一些东西。

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

inline modelData_t md2Loader::load_model(const std::string& model_file){
    modelData_t result;
    result.numVertices = 1000;
    result.numTextures = 10;
    return result;
}
查看更多关于

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


您需要
inline
头文件中定义的函数“Do the#ifndef,#define preprocessor directives not help?”不需要!你能提供一个链接到它背后的理论吗。来自Java的背景有时让我有点困惑…@kimsay补充了一点documentation@kimsay
inline
将函数标记为可以在不同的转换单元中使用。ODR允许编译器假设它发现多个定义都是相同的,并且可以合并它们。Java没有
#include
,因此您从一开始就不会遇到问题。
#include "Model.h"
#include "md2Loader.h"

Model::Model(){}

Model::Model(const std::string& model_file){
    model = md2Loader::load_model(model_file);
}
#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
inline modelData_t md2Loader::load_model(const std::string& model_file){
    modelData_t result;
    result.numVertices = 1000;
    result.numTextures = 10;
    return result;
}