2016-11-23 8 views
0

もしそれがうまくいくかどうかを知るためには、私はヘッダファイルに関数を完全に定義し、 cppファイル。 C++関数は、使用されている変換単位で定義する必要はありません。そのため、ヘッダーファイルはほとんどすべて正方向の宣言(インライン関数を除く)です。しかし、私はこのプロジェクトをコンパイルしようとしたとき、未解決の外部があると言いました。ヘッダファイルがコンパイルされていないか(C++ Visual Studio 2015)

ヘッダーファイルの内容全体をソースファイルに移動しても(ヘッダーファイルを削除した)、コンパイルして正常に実行されました。だから、プロジェクトをビルドするときにヘッダファイルがコンパイルされないだけですか、それとも私が知らない例外がいくつかありますか?

さらに、プロパティエクスプローラのヘッダーファイルのプロパティに移動してFile TypeC/C++ Codeに設定し、拡張子を.cppに変更しても、コンパイルされません(ただし、単に削除しても私は奇妙な部分だと思う新しいソースファイルを作成する)。

(私は/Za無効の拡張子を持つ働いている、それが何かを変更した場合)

ここでは、コードファイルには、ヘッダファイルがで含まれてい

//main.cpp 
void foo(); 

void main() 
{ 
    foo(); 
} 

とヘッダファイル

//test.h 
#include <iostream> 

void foo() 
{ 
    std::cout << 'a'; 
} 
+3

ヘッダーファイルは、 '#include'前処理を介して翻訳単位に引き込まれない限りコンパイルされません。あなたの唯一の.cppファイルにはこのようなインクルードが含まれていないので、コンパイルされていないため、その(そして明らかにあなたの唯一の)翻訳単位では利用できません。 – WhozCraig

+0

http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile。html –

答えて

3

ですプリプロセッサをコンパイル単位 - cppファイルに追加します。その後、cppファイル内のソースコードのみがコンパイラによってコンパイルされます。

ファンクション定義をヘッダ.hに入れると、このヘッダファイルをmain.cppに含めないでください。プリプロセッサにはmain.cppにインクルードされていないため、このヘッダファイルはコンパイルされません。

プリプロセッサジョブの結果を自分で確認することができます。 Visual Studioでは、Preprocessorプロパティページで/Pオプションを使用します。 main.cppの場合、出力はmain.iになります。

1

ヘッダーファイルは単独ではコンパイルされません。実際にテキストが含まれている.cppファイル内にあるとします。この新しい「結合された」ファイルはコンパイルされたものです。したがって、ヘッダファイルに関数を入れることができ、.cppファイルに関数が含まれているとコンパイルされます。

なぜなら、2番目の.cppファイルに含めると、もう一度コンパイルしようとすると問題が発生するからです。

1

ヘッダーの関数定義での問題は、それらがスキップされたということではありません。実際のリスクは、が2回とコンパイルされていることです。 C++には1つの定義ルールがあり、そのルールを2回コンパイルしてそのルールに違反します。

言及する重要な例外が1つあります。inline機能は免除されており、各翻訳単位で定義されている可能性があります。