Microsoft Visual Studio Express 2013 を使用しています。
ヘッダーファイルで使った構造体を複数のcppファイルで使用しようと思い、次のように書きました。
--Struct.h--
#pragma once
struct MyStruct{
int a;
}S;
extern struct MyStruct S;
----Source1.cpp---
#include "Dxlib.h"
#include "Struct.h"
S.a = 1;
----Source2.cpp---
#include "Dxlib.h"
#include "Struct.h"
S.a = 2;
ところが、
error LNK2005: "struct MyStruct S" (○○…)は Source1.cpp既にSource2で定義されています。
error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。C:\DxLib\Debug\GameProg_2012.exe GameProg_2012
というエラーが出てうまくいきません。調べてみたところ、ヘッダーファイルに二重インクルード防止のコードを書くことで回避できる。という内容があったので実行してみたのですがうまくいきませんでした。
Source1,Source2どちらかの #include "Struct.h" を削除するとエラーが解消されます。
別の手段として、構造体の内容をcppファイルに書き写して別のcppファイルでextern宣言してみたのですが、これもうまくいきませんでした。
構造体のextern宣言は次のようにやりました。
--Struct.cpp--
struct MyStruct{
int a;
}S;
--Source1.cpp--
extern struct S;
なるべくメインファイルを分割してゲームを作りたいのですが、うまくいきません。
例えば、Struct.h (またはStruct.cpp) に書いた構造体の内容をSource1.cpp、 Source2.cpp、Source3.cpp など複数のソースファイルで使用できるようにするにはどうしたらよいのでしょうか。
構造体を複数のファイルで利用できません
Re: 構造体を複数のファイルで利用できません
ここの最後のSが蛇足です。Leo さんが書きました:struct MyStruct{
int a;
}S;
これを修正すれば、ここの方法でとりあえず使用できるようにできると思います。
http://dixq.net/rp/5.html
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 構造体を複数のファイルで利用できません
この書き方は止めましょう。Leo さんが書きました:Microsoft Visual Studio Express 2013 を使用しています。
ヘッダーファイルで使った構造体を複数のcppファイルで使用しようと思い、次のように書きました。
--Struct.h--
#pragma once
struct MyStruct{
int a;
}S;
これには2つの意味があります。
- 構造体struct MyStructを宣言している
- 変数Sを定義している
Leoさんの例では、Source1.cppとSource2.cppが別々にコンパイルされます。
#includeで指定されたファイルは「コンパイル前に」その内容が展開されます。
Leoさんの例では、Source1.cppとSource2.cppの「それぞれ」にStruct.hの内容が挿入されたと考えてください。
この時に何が起こるか考えます。
まず、Source1.cppでは変数Sが「定義」されています。
コンパイラは、Source1.cppのコンパイル結果としてSource1.objを生成しますが、
Sという名前の変数が存在するという情報をSource1.objに埋め込みます。
次に、Source2.cppをコンパイルします。
Source2.cppでは変数Sが「定義」されています。
コンパイラは、Source2.cppのコンパイル結果としてSource2.objを生成しますが、
Sという名前の変数が存在するという情報をSource2.objに埋め込みます。
最後にリンカがSource1.objとSource2.objをマージしてexeファイルを作成します。
この時にリンカがSという変数が2つあることに気が付き、LNK2005エラーを出します。
これはLeoさんが勘違いしています。Leo さんが書きました: ヘッダーファイルに二重インクルード防止のコードを書くことで回避できる。という内容があったので実行してみたのですがうまくいきませんでした。
先ほど言った通り、コンパイル単位はファイルです。
Source1.cppとSource2.cppはそれぞれ1度しかStruct.hをインクルードしていません。
#pragma onceは例えば、Source1.cppで2回インクルードしたときに、2回目のインクルード処理(ファイルの内容の展開)を行わないようにするオプションです。
まず、struct.hには構造体の宣言だけ書いてください。Leo さんが書きました: 例えば、Struct.h (またはStruct.cpp) に書いた構造体の内容をSource1.cpp、 Source2.cpp、Source3.cpp など複数のソースファイルで使用できるようにするにはどうしたらよいのでしょうか。
struct MyStruct{
int a;
};
↑Sという変数がないことに注意しましょう。
次に、Sという変数は適当なcppファイルで定義してください。
struct MyStruct S;
そして、新しくヘッダファイルを作成し、Sの宣言を行います。
例えば、hoge.hというファイルを作成して、
extern struct MyStruct S;
とします。
最後に、Sの定義を行った、ファイル以外でSを必要とするソースで上記新規作成したヘッダファイルをインクルードします。
Re: 構造体を複数のファイルで利用できません
みけCATさんとPocoさんのアドバイスの通り、ヘッダファイルでSを消して書き直しました。
--Struct.h--
#pragma once
struct MyStruct{
int a;
int b;
};
--hoge.h--
extern struct MyStruct S;
--Source1.cpp--
#include "Dxlib.h"
#include "hoge.h"
struct MyStruct P;
S.a = 10;
--Source2.cpp--
#include "Dxlib.h"
#include "hoge.h"
S.b = 10;
と書いたところ、最初の
error LNK2005: "struct MyStruct S" (○○…)は Source1.cpp既にSource2で定義されています。
error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
というエラーは解消されたのですが、
新たに S. の下に赤い波線が出て、
error C2143: 構文エラー : ';' が '.' の前にありません。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません。
error C2371: 'S' : 再定義されています。異なる基本型です。
IntelliSense: この宣言にはストレージ クラスまたは型指定子がありません。
IntelliSense: ';' が必要です。
というエラーが出てきました。
構造体の使い方がおかしいのでしょうか、; の付け忘れということも無さそうなので原因がさっぱりわかりません。
--Struct.h--
#pragma once
struct MyStruct{
int a;
int b;
};
--hoge.h--
extern struct MyStruct S;
--Source1.cpp--
#include "Dxlib.h"
#include "hoge.h"
struct MyStruct P;
S.a = 10;
--Source2.cpp--
#include "Dxlib.h"
#include "hoge.h"
S.b = 10;
と書いたところ、最初の
error LNK2005: "struct MyStruct S" (○○…)は Source1.cpp既にSource2で定義されています。
error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
というエラーは解消されたのですが、
新たに S. の下に赤い波線が出て、
error C2143: 構文エラー : ';' が '.' の前にありません。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません。
error C2371: 'S' : 再定義されています。異なる基本型です。
IntelliSense: この宣言にはストレージ クラスまたは型指定子がありません。
IntelliSense: ';' が必要です。
というエラーが出てきました。
構造体の使い方がおかしいのでしょうか、; の付け忘れということも無さそうなので原因がさっぱりわかりません。
Re: 構造体を複数のファイルで利用できません
まず、Source1.cpp。
struct MyStruct P;
Pという名前の変数の定義はあるみたいですが、Sって名前の変数の定義がありません。
あと、各cppファイルにstruct MyStructの情報がありません。
Struct.hもちゃんとインクルードしてください。
hoge.hにもStruct.hをインクルードしておきましょう。
struct MyStruct P;
Pという名前の変数の定義はあるみたいですが、Sって名前の変数の定義がありません。
あと、各cppファイルにstruct MyStructの情報がありません。
Struct.hもちゃんとインクルードしてください。
hoge.hにもStruct.hをインクルードしておきましょう。
Re: 構造体を複数のファイルで利用できません
すいません、Source1.cpp のstruct MyStruct P; はミスでした。
各cppファイルとhoge.hにStruct.hをインクルードしたところ、見事に解決しました。
みけCATさん、Pocoさん、アドバイスしていただき本当にありがとうございました。
各cppファイルとhoge.hにStruct.hをインクルードしたところ、見事に解決しました。
みけCATさん、Pocoさん、アドバイスしていただき本当にありがとうございました。