C++項目是由 .h 文件和 .cpp 文件組成的,如果 A文件(.h&.cpp) 使用了B件(.h&.cpp) 中定義的全局變量或者全局結(jié)構體熏版,這時 visual studio 會報錯:重定義或者多次定義。
解決辦法:
一、對于全局變量
在 B.h 中聲明全局變量禾嫉,并在前面冠上 extern 關鍵字,然后在 B.cpp 中定義即可孽椰。
int a; //在 .h 中,這個算定義锐涯,會報錯
extern int a; //在 .h 中用 extern 聲明
int a; //在 .cpp 中定義
那有人會問了,在 B.h 中聲明的 class B 的數(shù)據(jù)成員沒有用 extern 關鍵字啊升薯,怎么不報錯呢?因為 B 的數(shù)據(jù)成員是屬于類B的炮障,在 B.h 中不用加 extern 也算聲明,而不是定義智末。
之后 類A只需要 include B.h 即可使用變量 a。
二由蘑、對于全局結(jié)構體
在 B.h 中定義的全局結(jié)構體,可以在 A 中直接使用該結(jié)構體類型來定義變量裳擎;
// B.h
struct XXX
{
int a;
int b;
};
//A.h
XXX tmp;
//A.cpp
tmp.a=0;
tmp.b=1;
在 B.h 中定義的全局結(jié)構體, A 中使用該類型來定義變量時需要 extern 聲明抢野;
// B.h
struct XXX
{
int a;
int b;
};
//A.h
extern queue<XXX> tmp;
//A.cpp
queue<XXX> tmp;
三启涯、對于全局函數(shù)
同樣黎做,也可以在 頭文件用 extern 聲明,在cpp文件實現(xiàn)酥艳。
// B.h
extern bool isValid(int y);
//B.cpp
bool isValid(int y)
{
return y>0? true : false;
}
總結(jié):
- 頭文件 (.h) 是該類提供的接口的聲明,接口包括該類提供給其它類調(diào)用的全局變量和函數(shù)骤铃,對這些變量和函數(shù)都需在 .h 中文件中冠以 extern 關鍵字聲明。
- 不要在頭文件 (.h) 中定義全局變量补鼻。
- 其他類要使用該類的變量或者函數(shù),直接包含該類的頭文件即可硼婿。