2016-08-26 10 views
0

this質問から例を借りました。以下のファイルがあります。関数定義がなくてもコンパイルに成功

main.cppに

#include <iostream> 
#include "foop.h" 

int main(int argc, char *argv[]) 
{ 
int x=42; 
std::cout << x <<std::endl; 
std::cout << foo(x) << std::endl; 
return 0; 
} 

foop.h

#ifndef FOOP_H 
#define FOOP_H 
int foo(int a); 
#endif 

foop.cpp

int foo(int a){ 
    return ++a; 
} 

main.cppにはfoop.hが含まれていますが、foop.hには、関数fooの定義ではない宣言のみが含まれています。 main.cppfoop.cppの存在とfooの定義をどのように知っていますか?私の最初の推測では*.hの名前が*.cppのと同じであるならば、それは何らかの形で魔法のように動作するということでしたが、私はfoop.cpp

foop2.cppにPS名前を変更したら、それはまた、働いていた:私は、同じディレクトリ内で、一つのプロジェクトの下にファイルを保存しますVisual Studio内

PPS:何が起こっているかを見るために何らかの形でコンパイルプロセスをデバッグすることはできますか?

+0

質問ごとに1つの質問をお願いします。簡潔な回答を書いたり、該当する場合は適切な詐称を見つけやすくしてください。 –

+1

'私はファイルを1つのプロジェクトの下に置いています。 ' - これは重要な部分です。 MSVC++プロジェクトは、(一度コンパイルすると)一緒にリンクする必要があるファイルのグループです。別々のプロジェクトにあるファイルでは、あるプロジェクトをライブラリプロジェクトにして、その最初のプロジェクトを使用するように他のプロジェクトに指示する必要があります。 – MSalters

+0

@MSaltersありがとう、これは答えになるはずです。 –

答えて

2

コンパイラは、の定義について知る必要はありません。それがリンカの仕事です。

+0

私が正しいと理解していれば、Visual Studioでコンパイラをコンパイルしたときにコンパイラはすべてのファイルをコンパイルします(構文上正しいとしても、メイン()なしの関数定義のみであっても)テーブル)を二重の質問で述べていますか? –

関連する問題