C++ 避免标题的多个定义
我花了大约2天的时间来研究避免对某些数组进行多重定义,我发现了ifdef和bla-bla。所以我试着用这个ifdef测试我的程序,但它什么也不做,调试器仍然说有多个定义。我的程序是这样工作的 当然有多个定义,但我需要像我在图片中给你展示的那样。。。我认为这是一个编译器问题或与编译器相关的问题 PD:我想你不需要任何代码来解决我的问题,如果你需要,我会和你分享 GameObject.h:C++ 避免标题的多个定义,c++,header,C++,Header,我花了大约2天的时间来研究避免对某些数组进行多重定义,我发现了ifdef和bla-bla。所以我试着用这个ifdef测试我的程序,但它什么也不做,调试器仍然说有多个定义。我的程序是这样工作的 当然有多个定义,但我需要像我在图片中给你展示的那样。。。我认为这是一个编译器问题或与编译器相关的问题 PD:我想你不需要任何代码来解决我的问题,如果你需要,我会和你分享 GameObject.h: #ifndef GameObject_H #define GameObject_H #pragma once
#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的意思是,不要将定义放入头文件中。您的浮动多维数据集[]=。。。这是一个定义。不要在头文件中这样做。这会引起一大堆麻烦。