1

我正在使用 VC++ 中的表单应用程序。我有主窗体,即 Form1.h,还有名为 child.h 的子窗体。我在 form1.h 的按钮单击上调用 child.h 表单。为了调用 child.h,我必须在 Form1.h 中包含 Child.h。

我在 Form1.h 中使用了以下代码

    #incude "Child.h"

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
     Child^ c=gcnew Child;
     c->Visible=true;
}

在 Child.h 中,我正在做一些处理。为此,我制作了一个名为param.h的头文件,其中包含一些函数名称和全局变量名称。我在 Child.h 文件中包含了 param.h。

param.h 是

#ifndef param_h_seen
#define param_h_seen
#define LED_Line 4
#define CALIBRATION_MODE 0
typedef unsigned __int32 uint32_t;
typedef unsigned __int8 uint8_t;

/****for LED ROI entered by user***/
int x_of_roi=6;
int y_of_roi=10;
/********************************/

/*************for graph ROI*******/
int ROIwidth=16;
int ROIheight=4096;

/********************************/
int LED_num= 64;
unsigned short *calib_factor;
/*********functions*****************/

int find_area(unsigned char *intensity,int start);

void DetectRectangle();
/***************************************/


#endif

包含 child.h 后显示错误

PUMA_LED_TESTER.obj : error LNK2005: "unsigned short * calib_factor" (?calib_factor@@3PAGA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int x_of_roi" (?x_of_roi@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int y_of_roi" (?y_of_roi@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int ROIwidth" (?ROIwidth@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int ROIheight" (?ROIheight@@3HA) already defined in Child.obj
PUMA_LED_TESTER.obj : error LNK2005: "int LED_num" (?LED_num@@3HA) already defined in Child.obj

我不知道为什么会出现这些错误。任何人都可以告诉我解决这些错误的解决方案吗

提前致谢

4

2 回答 2

3
int x_of_roi=6;
int y_of_roi=10;

Those are definitions, and should not be in your header files. Place them in one of the cpp files, and on the header have:

extern int x_of_roi
extern int y_of_roi;

Same goes with the rest of the global variables you declare in your header files. When those headers are included by more than one cpp file (namely translation unit), each unit effectively declares new variables with the same name, which the linker complains about.

于 2012-07-17T13:10:07.510 回答
0

每次#include将标题添加到源文件中时,结果都与复制/粘贴标题文本相同。因此,如果您有一个定义某些内容的标题:

header.h:
int magic = 0xA0B1C2D3

并将其包含在多个 cpp 文件中:

source1.cpp:
#include "header.h"
<...>

source2.cpp:
#include "header.h"
<...>

结果是为每个 cpp 定义了变量和宏。在这种情况下,没关系。但是,如果您有更复杂的依赖关系,这可能会导致您当前遇到的错误。

在您的情况下,您基本上包含两次相同的文件,这会导致具有相同名称的东西的多重定义。您需要做的是将定义放在头文件之外,并extern在需要从其他地方访问它们时使用。

于 2012-07-17T13:41:02.653 回答