如何解决尝试在头文件中包含特定功能时会导致错误
这是我的threeD.h
:
#pragma once
#include "SDL.h"
#include <vector>
struct vec3
{
float x,y,z;
};
struct vec2
{
float x,y;
};
struct triangle3D
{
vec3 v[3];
};
class Triangle2D
{
Triangle2D(vec2 v1,vec2 v2,vec2 v3)
{
this->v[0] = v1;
this->v[1] = v2;
this->v[2] = v3;
}
~Triangle2D() { };
void draw(SDL_Renderer* renderer,int r,int g,int b,int a)
{
SDL_SetRenderDrawColor(renderer,r,g,b,a);
SDL_RenderDrawLine(renderer,v[0].x,v[0].y,v[1].x,v[1].y);
SDL_RenderDrawLine(renderer,v[1].y,v[2].x,v[2].y);
SDL_RenderDrawLine(renderer,v[2].y,v[0].y);
}
private:
vec2 v[3];
};
vec2 projectAndTransform(SDL_Window* window,vec3 v,float fov)
{
vec2 newVec;
float fovScale = fov/ v.z;
float w = (float)SDL_GetwindowSurface(window)->w;
float h = (float)SDL_GetwindowSurface(window)->h;
newVec.x = (v.x + 1) * (w / 2);
newVec.y = (v.y + 1) * (h / 2);
return newVec;
}
struct mesh3D
{
std::vector<triangle3D> m;
};
struct mesh2D
{
std::vector<Triangle2D> m;
};
这是我的game.h
:
#pragma once
#include <iostream>
#include "SDL.h"
#include "threeD.h"
class Game
{
public:
Game(const char* windowName,unsigned int xWindowPos,unsigned int yWindowPos,unsigned int windowWidth,unsigned int windowHeight,bool fullScreen);
~Game();
bool init();
bool constructwindowAndRenderer
(
const char* windowName,bool fullScreen = false
);
void update();
SDL_Window* getwindow();
void clearWindow();
void render();
bool handleEvents();
private:
SDL_Window* window = nullptr;
SDL_Renderer* renderer = nullptr;
SDL_Event event;
bool quit = false;
mesh3D m;
};
每当我尝试将threeD.h
包含在game.h中时,我都会报错:
Severity Code Description Project File Line Suppression State
Error LNK2005 "struct vec2 __cdecl projectAndTransform(struct SDL_Window *,struct vec3,float)" (?
projectAndTransform@@YA?AUvec2@@PAUSDL_Window@@Uvec3@@M@Z) already defined in game.obj learnSDL
C:\Users\myself\source\repos\learn\learn\main.obj 1
从错误消息中,我发现projectAndTransform
文件中的threeD.h
函数存在问题。所以我尝试将其注释掉,并且效果很好。问题必须是projectAndTransform
函数,但是我看不到任何可能导致错误的函数。谢谢
解决方法
https://en.cppreference.com/w/cpp/language/inline
// function included in multiple source files must be inline
inline int sum(int a,int b)
{
return a + b;
}
程序中的内联函数或变量(自C ++ 17起)可能有多个定义,只要每个定义出现在不同的转换单元中(对于非静态内联函数和变量(自C起) ++ 17))所有定义都是相同的。例如,可以在包含在多个源文件中的头文件中定义内联函数或内联变量(自C ++ 17起)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。