C++ 入門サイトやここのサイトを一通り勉強しました
一つのファイルに同じクラス定義や関数定義を二つ書くと
コンパイルの段階でエラーになります
では次の二つの場合の挙動の違いについて教えてください
①
test.h------------------------ ---------------------------
a.cpp------------------------- ------------------------------
b.cpp-------------------------------- ------------------------------
↑はコンパイルは通りますがリンカの段階でTest()が二重定義とされエラーになります
②
test.h----------------------------- ---------------------------
a.cpp-------------------------
#include "testh.h"
#include<stdio.h>
void Test1(CTest& Test);
int main(){
CTest Test;
Test1(Test);
return 0;
}
b.cpp-------------------------------- ------------------------------
↑問題なくコンパイルもリンクも通る
①はTest()の定義がa.objとb.objにそれぞれインクルードされたため同じ関数の定義がファイルをまたいで二つあるのでリンカエラーが起きたのだと思います
ならば②も同様にファイルをまたいでCTestのクラス定義がa.objとb.objにインクルードされているのでエラーが起きると思うのですが、起きません。
今ままでなんとなくファイル分割をしてきたので、この違いがわかりません。
どうかご教授ください
なるべく専門的な範囲(リンカの挙動の違いとか)でわかりやすく(無茶ですいません)おねがいします