微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试在头文件中包含特定功能时会导致错误

如何解决尝试在头文件中包含特定功能时会导致错误

这是我的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 举报,一经查实,本站将立刻删除。