1、定義包含了聲明,但是聲明不包含定義,
如 int a = 0; //定義並聲明了變量 a
extern int a; //只是聲明了有一個變量 a 存在,具體 a 在哪定義的,需要編譯器編譯的時候去找。
2、函數也是類似,定義的時候同時聲明。但如果只是聲明,編譯器只知道有這么個函數,具體函數怎么定義的要編譯器去找。
void fun1(); //函數聲明 void fun1(){ //函數定義 cout<<"fun1"<<endl; }
3、extern 關鍵字聲明在變量和函數之前的說明。
(1)、作用在變量之前
變量只允許定義一次,但可以在多個文件中聲明。
Test.cpp 中:
int s32Val = 0; // 定義一個變量 s32Val,並賦初值為 0
Test1.cpp 中:
extern int s32Val; // 聲明變量 s32Val,它在 Test.cpp 中被定義,此處不可賦值
Test2.cpp 中:
extern int s32Val; // 聲明變量 s32Val,它在 Test.cpp 中被定義,此處不可賦值
(2)、作用在函數之前
Test.h:
extern void Fun(); // 函數聲明,extern 用於標識次函數為外部可調用函數
Test.cpp:
void Fun(); // 函數定義
4、C/C++ 編譯 cpp 文件是從上往下編譯,所以 main 函數里面調用其他函數時,如果其他函數在 main 函數的下面,則要在 main 函數上面先聲明這個函數。或者把 main 函數放在最下面,這個不僅限於 main 函數,其他函數的調用都是如此。被調用的函數要在調用的函數之前聲明
5、注意
用 extern 聲明外部變量是不能進行初始化: