C++ 避免标题的多个定义

C++ 避免标题的多个定义,c++,header,C++,Header,我花了大约2天的时间来研究避免对某些数组进行多重定义,我发现了ifdef和bla-bla。所以我试着用这个ifdef测试我的程序,但它什么也不做,调试器仍然说有多个定义。我的程序是这样工作的 当然有多个定义,但我需要像我在图片中给你展示的那样。。。我认为这是一个编译器问题或与编译器相关的问题 PD:我想你不需要任何代码来解决我的问题,如果你需要,我会和你分享 GameObject.h: #ifndef GameObject_H #define GameObject_H #pragma once

我花了大约2天的时间来研究避免对某些数组进行多重定义,我发现了ifdef和bla-bla。所以我试着用这个ifdef测试我的程序,但它什么也不做,调试器仍然说有多个定义。我的程序是这样工作的

当然有多个定义,但我需要像我在图片中给你展示的那样。。。我认为这是一个编译器问题或与编译器相关的问题

PD:我想你不需要任何代码来解决我的问题,如果你需要,我会和你分享

GameObject.h:

#ifndef GameObject_H
#define GameObject_H

#pragma once

float cube[] =
{
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f, 1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    -1.0f,-1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    -1.0f,-1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f,-1.0f,
    1.0f,-1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f,-1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f,-1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f,-1.0f, 1.0f
};

float Space3D_X[] =
{
    0.0f, 0.0f, -100,
    0.0f, 0.0f, 100
};

float Space3D_Z[] =
{
    -100.0f, 0.0f, 0.0f,
    100.0f, 0.0f, 0.0f
};

float Space3D_Y[] =
{
    0.0f, -100.0f, 0.0f,
    0.0f, 100.0f, 0.0f
};

typedef struct GameObject
{
    int ID, parent;
    Vector3 position;
    Quaternion rotation;
};

struct GameObject GameObjects[65536];

typedef struct Entity
{
    static int GameObjectsCount;
    int CreateCube (Vector3 _position, Quaternion _rotation, int _parent);
    void SetGameObjectParent (int _gameObject, int _parent);
};

Entity Entity_t;

#endif // GAMEOBJECT_H

页眉保护仅处理在单个翻译单元中直接或间接包含页眉多次的问题

例如,给定typedef x y;不能在同一范围内重复相同的typedef:

typedef x y; // fine
typedef x y; // Not allowed -- `y` is already defined
多次包含同一个标头(通常不是直接包含两者)可能会导致此类问题,而这正是标头防护所防止的

如果在多个源文件中包含同一个头,那么头保护根本没有帮助。一个明显的例子是在头文件中定义了一个对象。然后,当链接包含该头的多个源文件时,最终会出现来自该对象的多个定义的链接错误

解决这个问题的方法是编写代码,以便该对象的定义在一个源文件中只出现一次。然后,标头仅包含该对象的声明。例如:

source.cpp:

int x[1234];
资料来源.h:

extern int x[];

这使x可见,因此其他源文件中的代码可以访问x,但只能在一个位置定义它,这样就不会违反“一个定义”规则,导致链接器抱怨多个定义。

将定义放入cpp文件。如果将它们放在标题中,它们将在包含标题的每个cpp文件中定义

GameObject.h

#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H

extern float cube[];
...
typedef struct GameObject
{
    int ID, parent;
    Vector3 position;
    Quaternion rotation;
};

extern GameObject GameObjects[65536];
...
#endif
GameObject.cpp

#include "GameObject.h"

float cube[] = {...};
...
GameObject GameObjects[65536];

不要将定义放入头文件。通常的方法是使用ifndef检查给定标记是否已定义,然后定义它,编写所有代码并以endif结尾。可能重复我告诉过你我已经这样做了,但仍要检查代码。如果是@KerrekSB的注释,请不要将定义放入头文件。Kerrek的意思是,不要将定义放入头文件中。您的浮动多维数据集[]=。。。这是一个定义。不要在头文件中这样做。这会引起一大堆麻烦。