Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 已在main.obj中定义的一次性包含的.h函数_C++_Header Files_Sfml - Fatal编程技术网

C++ 已在main.obj中定义的一次性包含的.h函数

C++ 已在main.obj中定义的一次性包含的.h函数,c++,header-files,sfml,C++,Header Files,Sfml,好吧,简单地说:我在另一个.h中包含了一个.h,我得到一个编译错误,告诉我函数已经在main.obj中定义了 但是,我只包含了Graphics.h一次,那么main.obj怎么可能也定义了Graphics.h函数呢? 我得到一个错误LNK2005“已经在main.obj中定义” Graphics.h包含许多其他文件需要的函数,但目前只有一个文件存在问题,所以我想先解决这个问题 编辑:已解决通过拆分标题,我保留了函数原型的标题,并为函数定义创建了一个新的Graphics.cpp 这里是最受关注的文

好吧,简单地说:我在另一个.h中包含了一个.h,我得到一个编译错误,告诉我函数已经在main.obj中定义了 但是,我只包含了Graphics.h一次,那么main.obj怎么可能也定义了Graphics.h函数呢? 我得到一个错误LNK2005“已经在main.obj中定义”

Graphics.h包含许多其他文件需要的函数,但目前只有一个文件存在问题,所以我想先解决这个问题

编辑:已解决通过拆分标题,我保留了函数原型的标题,并为函数定义创建了一个新的Graphics.cpp

这里是最受关注的文件,我已经对文件内容进行了注释,因此它是可读的。 如果我的评论是错误的,请告诉我,我会把它放在pastebin或类似的东西上

main.cpp

#include "main.h"

using namespace std;

int main()
{
    sMainData data = {};
    main_Initialize(data);

    while (data.config.window.isOpen())
    {
        main_Event(data);
        main_Update(data);
        main_Draw(data);
    }
    return 0;
}
main.h文件:

#ifndef MAIN_H
#define MAIN_H

#include <SFML/Graphics.hpp>
#include "PlayerClass.h"

// Structures...
// Prototypes...
// Functions...

#endif // !MAIN_H

您没有提供一个最小的可复制示例,但我的最佳猜测是,您在头文件中实现了一些函数,而最终直接或间接地将该头包含在多个cpp文件中。结果是在两个cpp文件中编译具有完全相同签名的完全相同的函数,这会导致链接器抱怨

解决方案:

  • 将函数移出标头并放入其自己的cpp文件(可能是最好的)
  • 找到一种只在一个cpp文件中包含标题的方法(如果标题不是您的,并且您不想触摸它,则可能是第二个最好的方法)
  • 使该函数内联(可能是最简单的,但技术上最差的)

您是否在头文件中定义函数?您猜对了,就是这样D我的标题中既有原型又有定义,我没想到这会引起问题。通过为函数创建Graphics.cpp解决definition@NicolasGranier,确保你明白这里发生了什么。这不是什么魔法。头文件并没有什么神奇的特殊之处。您可以通过手动粘贴整个标题内容而不是包含行来模拟标题及其包含的工作方式。因此,通过将其包含在两个位置,您几乎已经将所有内容复制并粘贴到了这两个位置,包括该函数,因此它现在实现了两次。请注意,
#ifndef。。。在这种情况下,某些_KEY_H
块没有帮助,因为您是从完全独立的cpp文件中包含它。好的,感谢您的新评论,我花了更多时间思考此错误,我可能已经理解了错误发生的原因:D所以。。。包括一个用于复制和粘贴其内容的.h egal。如果我是对的,我确实包含了2倍的Graphics.h,因为main.h包含了包含Graphics.h的播放器(我想这就是你所说的“间接包含”)。我已经定义了两次函数,这就产生了错误。哦,如果我是对的,我想我学会了包含的顺序:D main.obj已经有了我的函数,这意味着他在PlayerClass.h之前就包含了Graphics.h。因此,当我调用
#include“main.h”
时,文件调用者拥有优先权,并首先为他复制/粘贴所有内容。在那之后,他包括了玩家阶级需要什么等等。。。老兄,知道发生了什么感觉真好哈哈。这不是学校教我的哈哈
#ifndef PLAYERCLASS_H
#define PLAYERCLASS_H

#include "AliveClass.h" // Including the mother

#include <SFML/Graphics.hpp>
#include <iostream>
#include <string>
#include "Graphics.h" // <-- So here we have our man

//Class definition

#endif // !1
#ifndef GRAPHICS_H
#define GRAPHICS_H

#include "SFML/Graphics.hpp"

// Prototypes...
// Functions...

#endif // !GRAPHICS_H