用例子給你示范
// 1.cpp
int x = 10;
// 2.cpp 注意沒有包含1.cpp
#include <iostream>
using namespace std;
extern int x;
int main ()
{ cout << x << endl; }
//則輸出10
兩個(gè)文件同在一個(gè)項(xiàng)目(project)中,你不包含某個(gè)文件(cpp)而可以用它內(nèi)部定義的變量,(這里是.cpp不是.h, 因?yàn)樵?h中定義的數(shù)據(jù)不能在.cpp中用除非這個(gè).cpp包含這個(gè).h文件)
例:
// 1.h
#include <iostream>
void print()
{
std::cout << "hello!" << std::endl;
}
// 2.cpp
#include <iostream>
using namespace std;
// 以上兩句在這個(gè)例子中可以不要
extern void print();
int main ()
{
print();
}
就會(huì)出錯(cuò)因?yàn)?.h中的void print();在不包含它的文件中是不可調(diào)用的,即使在聲明了extern 也于事無補(bǔ),如果你將這個(gè)例子中的1.h名字換成1.cpp就對了!
從這些可以看出來,extern在這里起的作用是告訴編譯器,你這個(gè)print()已經(jīng)在某個(gè).cpp中已經(jīng)定義了,這里只不過是聲明一下有這個(gè)東西,然后拿來用一下。定義只能出現(xiàn)一次,聲明卻可出現(xiàn)多次,也就是說extern聲明可在多個(gè)文件中用(包括.h)
還有,你還可以屏蔽extern聲明,如第二個(gè)例子中的第二個(gè).cpp文件可以改成
#include <iostream>
using namespace std;
// 這里以上兩句不能省略,因?yàn)椋@里extern void print();函數(shù)已經(jīng)不起作用了,在這里調(diào)用的而是本文件中定義的void print()函數(shù),其中用到了cout,endl;他們來源于std::<iostream>
extern void print();
void print()
{
cout << "world!" << endl;
}
int main ()
{
print();
}
// 輸出結(jié)果為world!
還有一個(gè)extern "C"就不用說了,用這個(gè)可以允許C++程序中調(diào)用C的函數(shù)!