インクルード ガードについては既に知っていますが、把握したい問題がいくつかあります。
例 1
フー。
int SumOfNums(int i, int j);
Foo.cpp
#include "Foo.h"
int SumOfNums(int i, int j){
return i+j;
}
main.cpp
#include "Foo.h"
#include "Foo.h"
int main(){
SumOfNumbs(5,10);
}
これはコンパイルして正常に実行されます。
例 2
フー。
int SumOfNums(int i, int j);
int i;
Foo.cpp
#include "Foo.h"
int SumOfNums(int i, int j){
return i+j;
}
main.cpp
#include "Foo.h"
int main(){
SumOfNumbs(5,10);
}
コンパイラによる 'i' の再定義。
例 3
フー。
int SumOfNums(int i, int j);
enum FooBar{FOO, BAR};
Foo.cpp
#include "Foo.h"
int SumOfNums(int i, int j){
return i+j;
}
main.cpp
#include "Foo.h"
int main(){
SumOfNumbs(5,10);
}
これはコンパイルして正常に実行されます。
例 4
フー。
int SumOfNums(int i, int j);
enum FooBar{FOO, BAR};
Foo.cpp
#include "Foo.h"
int SumOfNums(int i, int j){
return i+j;
}
main.cpp
#include "Foo.h"
#include "Foo.h"
int main(){
SumOfNumbs(5,10);
}
コンパイラに合わせて FooBar を再定義。
要約すると:
例 1 - インクルード ガードがないのに、なぜ Foo.h を main.cpp に 2 回インクルードできるのでしょうか?
例 2 - int 変数と関数ヘッダーの違いは?
例 3 - Foo.cpp と main.cpp に FooBar の定義が 1 つずつあるのに、リンカが文句を言わないのはなぜですか?
例 4 - これと例 1の違いは何ですか?