C++ 多定义C++;
好的,这已经包括在内了,例如: 但我在这里遗漏了一些细节 我有以下课程: Foo.cpp 和md2Loader.hC++ 多定义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
#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@kimsayinline
将函数标记为可以在不同的转换单元中使用。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;
}