構造体の使用方法
-
こんばんは
構造体の使用方法
ファイル分割をしていくうちに、構造体を2つのソースファイルで使用したいと思い、分けたのですがerrorLNK2005:"struct~~~は既に定義されています。と エラーになってしまいます。
構造体を2つのソースファイルで使用する方法を何方かご教授お願い致します。
-------------struct.h----------------
struct ABC
{
int x;
int y;
};
ABC abc[] = {
{10,20},{30,40}
};
---------------
---------spot.c-------------
void Spot(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------
---------nip.c-------------
void Spot(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------
構造体を2つのソースファイルで使用する方法を何方かご教授お願い致します。
-------------struct.h----------------
struct ABC
{
int x;
int y;
};
ABC abc[] = {
{10,20},{30,40}
};
---------------
---------spot.c-------------
void Spot(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------
---------nip.c-------------
void Spot(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------
Re: 構造体の使用方法
えーとソースの掲示にはcodeタグを使ってください。
とひとまず注意したとこで本題。
ヘッダーには宣言のみ記述できます。 のように実体をヘッダーに書くことはできません。
なぜなら#includeしたソースそれぞれに同じ名前の実体が作成され、
リンクするときに各ソースに存在する同じ名前でエラーになります。
なのでグローバル変数として宣言するなら、ヘッダーには だけにして、そのヘッダーを#includeしているCソースに移動しましょう。
もちろん一つのCソースにだけですよ? 笑
分割の定石
http://homepage3.nifty.com/mmgames/c_guide/20-02.html
とひとまず注意したとこで本題。
ヘッダーには宣言のみ記述できます。 のように実体をヘッダーに書くことはできません。
なぜなら#includeしたソースそれぞれに同じ名前の実体が作成され、
リンクするときに各ソースに存在する同じ名前でエラーになります。
なのでグローバル変数として宣言するなら、ヘッダーには だけにして、そのヘッダーを#includeしているCソースに移動しましょう。
もちろん一つのCソースにだけですよ? 笑
分割の定石
http://homepage3.nifty.com/mmgames/c_guide/20-02.html
written by へにっくす
Re: 構造体の使用方法
コンパイルが通ったとしても、今度はリンク時に、
Spot関数の定義が複数あるという理由で失敗しそうな気がします。
気のせいかもしれません。
【追記】
失礼しました。もともと、リンク時の話でしたね。
Spot関数の定義が複数あるという理由で失敗しそうな気がします。
気のせいかもしれません。
【追記】
失礼しました。もともと、リンク時の話でしたね。
最後に編集したユーザー box on 2012年7月14日(土) 07:03 [ 編集 1 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
こんばんは
Re: 構造体の使用方法
codeタグ申し訳ありません。
へにっくす様、返信ありがとうございます。
「分割の定石」こちらのサイトや「Ryujin5章~10章」などは実はファイル分割のさい大変お世話になったサイトです。
一つのCソースだけ・・・・。
ヘッダーに構造体を書いたのが間違いでしょか。
へにっくす様、返信ありがとうございます。
「分割の定石」こちらのサイトや「Ryujin5章~10章」などは実はファイル分割のさい大変お世話になったサイトです。
一つのCソースだけ・・・・。
ヘッダーに構造体を書いたのが間違いでしょか。
-
こんばんは
Re: 構造体の使用方法
失礼しました、下記なおしました
-------------struct.h----------------
struct ABC
{
int x;
int y;
};
ABC abc[] = {
{10,20},{30,40}
};
---------------
---------spot.c-------------
void Spot(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------
---------nip.c-------------
void nip(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------Re: 構造体の使用方法
~~~の部分が肝心なので、できれば省略せずに、全文を正確に載せてくださるとおおいに助かります。こんばんは さんが書きました: errorLNK2005:"struct~~~は既に定義されています。と エラーになってしまいます。
配列abc[]の定義をヘッダーファイルの中に書くことの是非はともかくとして、
C言語の場合、配列定義時のABCの前にstructが必要ではないのかなぁ、という気がします。
コンパイルエラーは出なかったのでしょうか?
それから、
この2個の.cファイルでは、間違いなくstruct.hをインクルードしているのですね?
コードを貼り付けるときは、そういうところも見せていただきたいんですよね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
こんばんは
Re: 構造体の使用方法
BOX様 返信ありがとうございます
エラー文書き込みましたので確認お願いいたします
1>nip.obj : error LNK2005: "struct ABC * abc" (?abc@@3PAUABC@@A) は既に Spot.obj で定義されています。
.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
エラー文書き込みましたので確認お願いいたします
---------spot.c-------------
#include "struct.h"
void Spot(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------
---------nip.c-------------
#include "struct.h"
void Spot(int xx, int yy, int num)
{
int x = abc[num].x;
int y = abc[num].y;
---------------.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
Re: 構造体の使用方法
本日6:42に投稿があった、へにっくすさんからの回答に従ってください。こんばんは さんが書きました: 1>nip.obj : error LNK2005: "struct ABC * abc" (?abc@@3PAUABC@@A) は既に Spot.obj で定義されています。
.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
回り道をさせてしまい、申し訳ありません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 構造体の使用方法
これについては他の方が回答されているように、こんばんは さんが書きました:.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
2つのソースで同じ関数名があるからです。
どちらか一方を名前変えるか、staticというキーワードをいれるかしてください。
codeタグをつけたのですね。こんばんは さんが書きました:失礼しました、下記なおしました
今度からはそうしてください。
コンパイラはC++だったりすると通っちゃった記憶があります。。box さんが書きました:C言語の場合、配列定義時のABCの前にstructが必要ではないのかなぁ、という気がします。
#classと同様にみられるせいかね
written by へにっくす
Re: 構造体の使用方法
これはCコードとしてコンパイルすると
といったエラーが出ますが structをつけなくてはいけません。もしくはtypedef キーワードを使って
のようにしないといけません。
[hr]
C++では 前者のコードはエラーも出ません。
1>main.c(11): error C2065: 'ABC' : 定義されていない識別子です。
1>main.c(11): error C2146: 構文エラー : ';' が、識別子 'abc' の前に必要です。
1>main.c(11): error C2065: 'abc' : 定義されていない識別子です。
1>main.c(11): error C2059: 構文エラー : ']'typedef struct /*コンパイラは自動的に__unnamed_struct_0001_1を付けます。*/
{
int x;
int y;
}ABC;
ABC abc[] = {
{10,20},
{30,40}
};
[hr]
C++では 前者のコードはエラーも出ません。
最後に編集したユーザー naohiro19 on 2012年7月14日(土) 09:49 [ 編集 1 回目 ]
-
こんばんは
Re: 構造体の使用方法
へにっくす様 ありがとうございました。
どちらか一方の「名前変える」又は「staticというキーワードをいれる」
上記両方とも試、エラーは解消され起動できました。
staticについて調べました↓
変数や関数をファイル内のみで使用し、他に対しては公開したくない場合にこの方法をとります。
外部変数や関数に対してstaticを使用すると、静的な記憶クラス定義(値を保持 する事だと思います)となり、その外部変数や関数はそれが定義されたファイル(モジュール)以外からは
「参照することができなくなる。」 = 1 つ以上の複数回定義されているシンボルが見つからなくなる。
っと 解釈したんですが、どうでしょうか。
一応 解決! にしておきます、間違っておりましたら何方でもよろしいので返信頂けると有難いです。
どちらか一方の「名前変える」又は「staticというキーワードをいれる」
上記両方とも試、エラーは解消され起動できました。
staticについて調べました↓
変数や関数をファイル内のみで使用し、他に対しては公開したくない場合にこの方法をとります。
外部変数や関数に対してstaticを使用すると、静的な記憶クラス定義(値を保持 する事だと思います)となり、その外部変数や関数はそれが定義されたファイル(モジュール)以外からは
「参照することができなくなる。」 = 1 つ以上の複数回定義されているシンボルが見つからなくなる。
っと 解釈したんですが、どうでしょうか。
一応 解決! にしておきます、間違っておりましたら何方でもよろしいので返信頂けると有難いです。
Re: 構造体の使用方法
その解釈であってます。こんばんは さんが書きました:「参照することができなくなる。」 = 1 つ以上の複数回定義されているシンボルが見つからなくなる。
ただし同じ関数名ってことは、同じ処理してるってことではないのでしょうか?
同じ処理をしているなら、一方は削除するべきなんですけどね。
そしてヘッダーにはプロトタイプ宣言を載せる・・・とか。
それぞれのファイルで違う処理をしているなら、名前を変更するのが妥当です。
そのファイルの中でしか使用しない関数であれば、staticをつけるべきです。
両方することなかったんですよ?
written by へにっくす