[解決済み] なぜcppファイルをインクルードせず、ヘッダを使用する必要があるのですか?
質問
そこで、初めてのC++プログラミングの課題を終え、成績を受け取りました。しかし、採点によると、私は以下の理由で点数を失いました。
including cpp files instead of compiling and linking them
. その意味があまりよくわからないのですが。
自分のコードを振り返ってみると、クラスのヘッダーファイルを作らず、すべてcppファイルで行うことにしました(ヘッダーファイルがなくても問題ないようでしたが・・・)。採点者は、私がいくつかのファイルで '#include "mycppfile.cpp"' と書いたことを意味したのだと推測しています。
私の推理では
#include
'cppファイルを作成することでした。
- ヘッダーファイルに入るはずのものが、すべてcppファイルの中に入っていたので、ヘッダーファイルのように見せかけた
- モンキー・シー・モンキー・ドゥの要領で、他のヘッダーファイルが
#include
'dをファイルに入れていたので、私のcppファイルにも同じことをしました。
では、具体的に何が悪かったのか、なぜ悪いのか?
どうすればいい?
私の知る限り、C++の標準はヘッダーファイルとソースファイルの違いを知らない。 この言語に関する限り、合法的なコードを含むテキストファイルは、他のものと同じです。 しかし、違法ではないものの、ソースファイルをプログラムに含めると、そもそもソースファイルを分離することで得られるはずだった利点がほとんどなくなってしまいます。
本来は
#include
は
プリプロセッサー
の前に、指定されたファイル全体をアクティブファイルにコピーします。
コンパイラ
が手に入る。 ですから、プロジェクト内のすべてのソースファイルを一緒にインクルードする場合、あなたが行ったことは、全く分離せずに1つの巨大なソースファイルを作ることと、根本的に違いがありません。
"ああ、それは大したことではありません。 動けばいいんだもん。 という声が聞こえてきそうですね。 そしてある意味、それは正しいでしょう。 しかし、今あなたは、小さな小さなプログラムと、それをコンパイルしてくれる比較的邪魔にならない素敵なCPUを相手にしているのです。 いつもそんなに幸運とは限らないのだ。
本格的なコンピュータ・プログラミングの世界に足を踏み入れると、数十行どころか数百万行に達するプロジェクトを目にすることになる。 これは膨大な行数だ。 そして、そのようなプロジェクトを最新のデスクトップコンピューターでコンパイルしようとすると、数秒どころか数時間もかかってしまうのだ。
いや~、恐ろしい話ですね。 どうしたらこの悲惨な運命を防げるのでしょうか!" 残念ながら、どうしようもないことです。 コンパイルに何時間もかかるなら、コンパイルに何時間もかかります。 しかし、それが本当に重要なのは最初の一回だけで、一度コンパイルしてしまえば、もう一度コンパイルする理由はないのです。
何かを変えない限りは。
さて、200万行のコードが1つの巨大なものにマージされたとして、次のような簡単なバグフィックスを行う必要があるとします。
x = y + 1
ということは、これをテストするために200万行をすべてコンパイルし直さなければならないことになります。 また、もしあなたが
x = y - 1
その代わりに、また200万行のコンパイルが待っているのです。 これでは、他のことに使えるはずの何時間もの時間が無駄になってしまいます。
でも、非生産的なのは嫌だ! 何か方法があれば コンパイル コードベースの異なる部分を個別に、そしてどうにかして リンク を、後から一緒にするんです!"。 理論的には素晴らしいアイデアです。 しかし、あなたのプログラムが、別のファイルで何が起こっているかを知る必要がある場合はどうでしょうか? 代わりに小さな小さな.exeファイルの束を実行したいのでなければ、コードベースを完全に分離することは不可能です。
しかし、きっと可能なはずです。 そうでなければプログラミングは純粋な拷問にしか聞こえない! を分離する方法を見つけたらどうだろう?
インターフェースと実装
? 例えば、これらの異なるコードセグメントから、プログラムの残りの部分と識別するのに十分な情報を取り出し、それらをある種の
ヘッダー
ファイルを作成するのですか? そうすれば
#include
プリプロセッサーディレクティブ
を使って、コンパイルに必要な情報だけを持ってくることができます!"
ふむ。 そこに何かヒントがあるかもしれませんね。 どうなるか教えてください。
関連
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] なぜ (int)x ではなく static_cast<int>(x) を使うのですか?
-
[解決済み] C++のヘッダーファイルで#ifndefと#defineが使われているのはなぜですか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】C++のforward宣言とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】coutはstdのメンバではない
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない