避免多个标头定义

时间:2015-05-21 16:46:51

标签: c++ header

我花了两天时间研究以避免某些数组的多重定义,我找到了[ValidationProperty("Value")] MyCustomField : ValidateUserControl, IHasTitle protected Panel ControlContainer; protected TextBox Field1; protected global::System.Web.UI.WebControls.Label Help; [Localize, VisualCategory("Appearance"), VisualFieldType(typeof(EditField)), VisualProperty("Help Text:", 101)] public string HelpText { get { return this.Help.Text; } set { this.Help.Text = value; } }和bla bla。所以我尝试使用#ifdef测试我的程序并且它没有做任何事情,调试器仍然说有多个定义。我的程序就是这样的。

enter image description here

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

PD:我认为您不需要任何代码来解决我的问题,如果您需要,我会分享。

GameObject.h:

#ifdef

2 个答案:

答案 0 :(得分:5)

将定义放入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];

答案 1 :(得分:1)

标题保护只处理在单个翻译单元中(直接或间接)多次包含标题。

例如,给定typedef x y;之类的内容,您无法在同一范围内再次重复相同的typedef

typedef x y; // fine
typedef x y; // Not allowed -- `y` is already defined

不止一次包含相同的标题(通常不是直接包含)可能会导致这类问题,这就是标题保护所阻止的。

标题保护程序根据多个源文件中包含相同标题的内容,执行帮助。很明显的例子是你在头文件中定义了一个对象。然后,当您链接多个包含该标题的源文件时,您最终会得到该对象的多个定义中的链接错误。

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

source.cpp:

int x[1234];

source.h:

extern int x[];

这使得x可见,因此其他源文件中的代码可以访问 x,但只能在一个地方定义,因此您不会违反一个定义规则,导致链接器抱怨多个定义。