0

1つの.hファイルのデータ(または関数)を他の多くの.cppファイルで使用しようとしていますが、リンクエラーを示唆するコンパイラ領域が表示されます。これは本当に簡単なことだと思いますが、私はそれで自分自身を傷つけています。私はXcodeを使用していますが、それが問題だとは思いません。少し考えている可能性がはるかに高いです。

私のバージョンはもっと複雑なので、私が探しているものの非常に単純な例を使用します。

ヘッダーファイルdata1.hがある場合:

 int a,b; // etc

次に、1つの.cppファイル、たとえばsetdataA.cpp:

 #include "data1.h"    
 void set_a(int numb){ a=1;} 

次に、setdataB.cppと言います。

 #include "data1.h"    
 void set_b(int numb){ b=10;} 

私は自分が何を間違っているのか疑問に思っています。

私も交換しようとしました

#include "data1.h"  

setdataB.cppで

#include "setdataA.h"

それでも機能しません!

4

3 に答える 3

5

まず、実際のエラーを提供すると役立ちます。

次に、ヘッダーの内容を次のようにINCLUDEGUARDでラップする必要があります。

#ifndef MY_UNIQUE_INCLUDE_GUARD
#define MY_UNIQUE_INCLUDE_GUARD
... // header contents
#endif

第三に、あなたの問題はおそらく、int aとbが両方の.cppファイルで定義されており(ヘッダーによるインクルードを介して)、複数の定義されたシンボルになっていることです。

代わりに、おそらくそれらを定義せずにヘッダーで宣言することを意味します。

extern int a;
extern int b;

次に、.cppファイルでそれらを定義します。

int a;
int b;

それらを1つの.cppファイルで定義するだけです。プロジェクトにとって意味がある場合は、1つの.cppファイルでaを定義し、別の.cppファイルでbを定義できます。

于 2012-07-16T17:10:59.513 に答える
1

私は自分が間違っていることを理解しました。それは、ヘッダーファイルが実際にどのように機能し、実際に何をしようとしていたかについての私の誤解と関係があり、私が実際に何をしようとしていたかについて人々(私に答えた)が間違っていた(私は彼らに謝罪します) 。

私がすべきだったのはdata1.cppにあります

int a;
int b;

void set_a(int numb) { a=numb; }
void set_b(int numb) { b=numb; }

int get_a() { return a }
int get_b() { return b }

次に、data.hに入れます

void set_a(int numb);
void set_b(int numb);

int get_a();
int get_b();

data.hは必要な数のファイルに含めることができ、aまたはbの設定または取得は、関数の値を直接変更または呼び出すのではなく、関数の1つを呼び出すだけで実行できます。

うまくいけば、これを解決しようとしている人にとって、これが役立つかもしれません。

(また、私が質問をする際の知識の欠如について少し恥ずかしかったので、それが非常に初歩的であると思ったときに少し恥ずかしかったので、戻ってこれに答えるのにかなり長い間申し訳ありませんでした。スタック上の質問、私はまた、私の質問は、私が求めていたものにもっとアイデアを与えるためにもっとよく尋ねられたかもしれないと思います)

于 2014-04-16T16:06:53.273 に答える
-1

私はこれに関して少しさびていますが、すでに含まれているファイルを含めるとリンクエラーが発生すると思います。あなたの例からはそうではないようですが、ファイルを詳しく見てください。この例では、エラーが発生します。file1.hにはfile2.hが含まれており、file3.hにはfile1とfile2の両方が含まれています。この場合、file2はfile3に2回含まれていることがわかります。

于 2012-07-16T16:57:56.670 に答える