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という名前のヘッダーファイルを1つ作成しました。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;

これらは定義であり、ヘッダーファイルに含めるべきではありません。それらをcppファイルの1つに配置し、ヘッダーには次のものがあります。

extern int x_of_roi
extern int y_of_roi;

ヘッダーファイルで宣言する残りのグローバル変数についても同じことが言えます。これらのヘッダーが複数のcppファイル(つまり、変換ユニット)に含まれている場合、各ユニットは、リンカーが不平を言う同じ名前の新しい変数を効果的に宣言します。

于 2012-07-17T13:10:07.510 に答える
0

ソースファイルにヘッダーを挿入するたび#includeに、結果はヘッダーのテキストをコピーして貼り付けるのと同じになります。したがって、何かを定義するヘッダーがある場合:

header.h:
int magic = 0xA0B1C2D3

そして、それをmultiplycppファイルに含めます。

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

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

その結果、変数とマクロが各cppに対して定義されます。この場合は問題ありません。ただし、より複雑な依存関係がある場合は、現在発生しているエラーが発生する可能性があります。

あなたの場合、基本的に同じファイルを2回インクルードしているため、同じ名前のものの定義が複数になります。あなたがする必要があるのは、ヘッダーファイルの外に定義を配置externし、他の場所からそれらにアクセスする必要があるときに使用することです。

于 2012-07-17T13:41:02.653 に答える