回答編集履歴
3
typo
answer
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
void bar();
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
#実体をヘッダで定義
|
|
26
|
+
#実体をヘッダで定義すると下記問題が発生します。
|
|
27
27
|
通常ヘッダは複数のcppファイルからインクルードされます。
|
|
28
28
|
例えば、main.cppやsub.cppからfoo.hをインクルードし、2つとものcppを使って1つのexeを作るようなことを良く行います。
|
|
29
29
|
この時、foo.hで「実体定義」していると、main.cppとsub.cppの両方でその実体が定義されてしまいます。結果、多重定義エラーになってしまいます。
|
2
追加
answer
CHANGED
|
@@ -43,4 +43,34 @@
|
|
|
43
43
|
このソースを1つコンパイルすることを指して「コンパイル単位」と呼びます。
|
|
44
44
|
|
|
45
45
|
1つのコンパイル単位の中で、同じヘッダが複数回インクルードされないようにする仕組みがインクルード・ガードです。
|
|
46
|
-
複数のコンパイル単位の中で、同じ実体が複数回定義されないようにするために、ヘッダで実体定義しないようにします。
|
|
46
|
+
複数のコンパイル単位の中で、同じ実体が複数回定義されないようにするために、ヘッダで実体定義しないようにします。
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
【追記】
|
|
50
|
+
|
|
51
|
+
> また、構造体の要素数がかなり多くなりそうなので別のファイルに定義したくて分割コンパイルについて調べたので、別のファイルで定義する良い方法が他にありましたら教えていただけるとありがたいです。
|
|
52
|
+
|
|
53
|
+
1つの構造体を複数のファイルに渡って定義することも不可能ではないですが、あまり行わないです。
|
|
54
|
+
たった1つの構造体の定義に例えば1,000行も使うような場合は、別の構造体に分割した方が良いと思います。
|
|
55
|
+
例えば下記のような手法を使えば、自然に分割できるケースが多いです。
|
|
56
|
+
```C++
|
|
57
|
+
struct SubStructA
|
|
58
|
+
{
|
|
59
|
+
:
|
|
60
|
+
};
|
|
61
|
+
struct SubStructB
|
|
62
|
+
{
|
|
63
|
+
:
|
|
64
|
+
};
|
|
65
|
+
struct SubStructC
|
|
66
|
+
{
|
|
67
|
+
:
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
struct BigStruct
|
|
71
|
+
{
|
|
72
|
+
SubStructA mSubStructA;
|
|
73
|
+
SubStructB mSubStructB;
|
|
74
|
+
SubStructC mSubStructC;
|
|
75
|
+
};
|
|
76
|
+
```
|
1
typo
answer
CHANGED
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
1つのcppから一度インクルードしたヘッダを、同じcppからヘッダ等を経由して再度インクルードしても中身をコンパイルしない仕組みです。
|
|
39
39
|
|
|
40
40
|
#ついでにコンパイル単位について補足
|
|
41
|
-
Visual Studioのソリューション・エクスプローラのSource Filesに登録した1つ1つのソース・ファイルが「コンパイル単位」となります。
|
|
41
|
+
Visual Studioのソリューション・エクスプローラのSource Filesに登録した1つ1つのソース・ファイルが事実上「コンパイル単位」となります。
|
|
42
42
|
これらのソースを1つ1つコンパイルして、objファイルを作り、最後にリンクしてexeファイルを作ります。
|
|
43
|
-
このソースを1つ
|
|
43
|
+
このソースを1つコンパイルすることを指して「コンパイル単位」と呼びます。
|
|
44
44
|
|
|
45
45
|
1つのコンパイル単位の中で、同じヘッダが複数回インクルードされないようにする仕組みがインクルード・ガードです。
|
|
46
46
|
複数のコンパイル単位の中で、同じ実体が複数回定義されないようにするために、ヘッダで実体定義しないようにします。
|