またまた質問させていただきます。
かなり初歩的なことなんじゃないかと思います。
開発環境の使い方?なんだと思いますが
プロジェクトのソースファイルを二つ以上に分けて書いていくとき、たとえばmain.c
と draw.c という風に、どうやってコンパイルすればいいんでしょうか?
またどちらかのファイルをどちらかのファイルにインクルードさせることは必要でしょ
うか?
あと宣言とか、どうやって書けばいいのかわかりません。
いろいろ試してみたんですが、宣言がみつからないとか色々エラーがわんさか出
て。。。
お願いします。
> いろいろ試してみたんですが、宣言がみつからないとか色々エラーがわんさか出
> て。。。
でたらめに試すよりも入門書をしっかり読んだ方が良いと思う。
大きな本屋で、ヘッダーファイルについての説明のがある、
かつ、自分に理解しやすい入門書を探してはいかがか。
VC6だと図書館の方が見つかると思う。
ヘッダーファイルでぐぐっても色々説明が見つかる。
多分それで解決するだろうし、「○○のHPのプログラムをビルドしようとしたら、
xxxxxというリンクエラーが出る」といった質問の方が、
このスレの質問よりも答えやすい。
掲示板で一から教えてもらうのは事実上無理です。
なにせ、説明の必要な内容が膨大すぎますから
基本的な知識なんかは解説してくれているホームページとか
書籍とかそういうのである程度身につけないと厳しいと思います。
ちょこっとだけ説明すると
ヘッダーファイルに色々まとめて書いておくと言うのは、
ソースファイル(拡張子がcpp)を複数に分けて書きたいとか
あるクラスの中で別のクラスの宣言部分が必要だとかいう時に
ヘッダーファイルをインクルードすれば、宣言部分を書くファイルは
一本で済むからです。
なので各ソース毎に必要なインクルードファイルを入れておけば良いと
いう考え方は同じクラスのソースを二つに分ける場合でも違うクラスの
ソースファイルを記述する場合でも同じです。
あと解決したいのであれば、エラーの内容は正確に書かないと駄目ですよ。
わんさか出ると書かれても掲示板を見ている方ではさっぱり解りませんし。
大量に出るなら出るで同じようなパターンの物もあるでしょうから、
パターン毎の代表的な例を挙げるとか何か提示するための方法を考える事も
必要です。これは別にプログラムが云々と言う話ではなくて
どうやったら読んでいる人に分かってもらえるような質問ができるかという
話なのでよく考えて書き込むようにすると良いと思います。
>いろいろ試してみたんですが、宣言がみつからないとか色々エラーがわんさか出
>て。。。
エラーのCXXXX,LXXXXをMSDN CDで検索するとヘルプが表示されるはずです。
どうもすいません。
エラーが50個も出るなんてことは初めてだったもので・・
ただたいちうさんの教えてくれたサイトを見て、すぐに解決できました。
ばらばらに分かれたソースファイルってどういう順番でコンパイルされていくのか分か
りませんが、cってコンパイルされるとき、ソースの上から下へ一度だけ走査されるっ
てどこかで見た気がするんですが、すこし不思議な感じがします。
確かにソースファイルを機能毎にばらしておけば、メインの部分なんかは分かりやすく
まとまりますね。
みなさん、ありがとうございました。
解決です。
> ばらばらに分かれたソースファイルってどういう順番でコンパイルされていくのか分か
> りませんが、cってコンパイルされるとき、ソースの上から下へ一度だけ走査されるっ
> てどこかで見た気がするんですが、すこし不思議な感じがします。
ソースファイルとヘッダーファイルの違いを意識しましょう。
それとプリコンパイルとコンパイルとリンクの違いも。
A.cppとB.cppがプロジェクトにある時、これらのそれぞれをコンパイルし、
リンク(つなぎ合わせて)して実行ファイルができます。
ヘッダーファイルは直接的なコンパイルの対象ではありません。
#includeというのは、指定されたファイルをその場所に展開することです。
例えば、#include <stdio.h>というのが、A.cppに書かれていたら、
その行の場所にstdio.hを貼り付けられたものとしてコンパイルされます。
このようにコンパイル前に処理されるのがプリコンパイルです。
VCではこれらを合わせてビルドと一言で言います。
A.cppとB.cppがプロジェクトにあり、A.cppに#include B.cppと書いた場合、
A.cppをコンパイルする時にB.cppの分のソースコードもコンパイルされ、
B.cppをコンパイルする時にももちろんB.cppのソースコードもコンパイルされます。
コンパイルが成功しても、その後のリンクで重複したオブジェクトがあるという
リンクエラーが多分多数出ます。
エラーが50個も出ると聞いて、最初に思いつくのがこのような状況ですが、
他の原因でエラーが多数出ることもありますので、次回質問する時には
気を付けてください。
細かいことだけど。
> このようにコンパイル前に処理されるのがプリコンパイルです。
一般にはプリプロセスと呼びます。
プリプロセスはコンパイルの処理の一部なので、#include等の展開処理は
プリコンパイルとは呼びません。
> VCではこれらを合わせてビルドと一言で言います。
リンクまで行い、実行可能ファイルまで作成するのがビルド。
(場合によってはもっといろいろな処理が行われているけど。)
重ね重ね恐れ入ります。
たいちうさんの書かれている方法は、自分もいつもそうしてるんで問題なく理解できて
るつもりなんですが、#include文で取り込まないで、ただプロジェクト内にソースファ
イルを複数参加させた場合どうなるか、というのがいまいちよく分からなかったもの
で・・
いろいろなAPIのラッパー関数みたいなものを、機能別にヘッダーファイル分けて、それ
ぞれに宣言・定義などまとめて書いておいてインクルードする、或いはDLL化して宣
言部分をヘッダーファイルにして、用途に応じて必要なときにインクルードして使う。
そういう風にはこれまでもしてきたんですが、ソースファイルを分割してビルドすると
いうのが、どういうものかイメージできなかった、というか・・
極端な話、WinMain関数とWndProc関数を別々のソースに書いても別に問題ないわけで、
ただこれまで全くそういう必要性が無かったので・・そこまで説明してる本もなかなか
無いくらい初歩的なことなんでしょうけど、どういう風にビルド?されるのかわからな
くて・・それでおかしな質問になってしまいました。
どうもすみません。
それから色々お答えいただいた方、どうもありがとうございました。
>ただプロジェクト内にソースファイルを複数参加させた場合どうなるか、というのがい
まいちよく分からなかったもの
で・・
複数のファイルをそれぞれコンパイルします。
一般的には、makefileを使うと思います。
下記が参考になるかも知れません。
http://www.unixuser.org/~euske/doc/makefile/index.html
http://www-ise3.ise.eng.osaka-u.ac.jp/miura/programLecture/lecture4.html
「分割コンパイル」がキーワードになります
けろっぴ3ダース軍曹さんのご意見どおりmakefileを使います。
makefileの記述方法は個々コンパイラーで変わります。
makefileを用いる方法は例外はあるかと思いますが、VCに限らず
殆どのコンパイラーで有効です。
VCにおいてのmakefile使い方はMSDN CDを検索すればわかると思います。
maru 様、訂正ありがとうございました。
私の理解と説明が雑すぎたようです。
ちょっと追記。
一本一本のソースファイルはそれぞれ独立してコンパイルされます。
実際に呼び出す先のコードが必要になるのはリンクの時なので
分割が直接影響するのはむしろリンクの時だと思います。
但し、VCの場合はプロジェクトに参加させておく事で自動的に
リンク対象になるのであまり問題になりません。
コンパイル時は#Include文を使ったヘッダファイルによる宣言部分の提供が
あれば、殆どの場合は大丈夫です。
通常は、グローバル変数のextern宣言もヘッダーに含めておくのが普通なので
そこまで考えてヘッダーファイルを作っておけば、問題は有りません。
問題が起こるとすると、相互参照から引き起こされるヘッダーファイルの
循環参照が発生した場合くらいでしょう。
これも解決法がちゃんと有りますのでそれを使えば問題は解決します。
とは言え、相互参照はなるべく内容に設計した方がいいでしょう。