我花了两天时间研究以避免某些数组的多重定义,我找到了[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
测试我的程序并且它没有做任何事情,调试器仍然说有多个定义。我的程序就是这样的。
当然有多个定义,但我需要像我在图片中向您展示的那样...我认为这是编译器问题或与编译器相关的事情。
PD:我认为您不需要任何代码来解决我的问题,如果您需要,我会分享。GameObject.h:
#ifdef
答案 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
,但只能在一个地方定义,因此您不会违反一个定义规则,导致链接器抱怨多个定义。