2008年8月14日 星期四

c++ - extern

C++有二個基本的原則:

1.對於變數或函數,可以宣告多次,但只能定義一次。
2.C++中,尋找變數或函數時,是採用Lookup(向上尋找定義或宣告)。
定義:告知程式這一個變數是什麼型態(例:int x)
宣告:告知程式這一個變數在其它地方有定義過了,請到其它地方找(例:extern int x)
以上是針對在變數方面

函數規則分成宣告與定義二種。當一個函數只有傳回值、名稱、傳入值, 沒有大括號{},compiler會把此種形式當成是函數宣告;如果加上了{}, 形成函數定義。所以你要宣告一個函數,只須 鍵入 int f();,extern可加 可不加,compiler會自動把它示為函數宣告。

[2008.11.28 補充]
基本上就是要用到其它檔案的變數,但是,確沒有把那一個檔案include進來,這個時候就要用到extern,讓它自己到其它的檔案找
main.cpp

#include <iostream>
using namespace std;

int main(){
  extern double someVar;
  cout << someVar << endl;

  return 0;
}


some.cpp

double someVar = 1000;


[2010.01.30 補充]
static中,我們有推測出,在同一個project中,所有的global變數都存放在同一個空間中,因此,若我們分別在不同的.c檔,宣告相同名稱的全域變數,會出現multiple definition of `x'錯誤。
但是,這並不表示,我們可以直接在main.c中,直接存取common.c中的全域變數。因為,在程式Compile流程的Compiler的部分,會先檢查.c檔中,在使用任何函式或變數時,先前是否有先宣告。雖然,global變數,是在同一個空間,若不宣告,在Compiler會檢查出有錯誤。
因此,這個時候,就要透過extern告知Compiler目前這一個.c檔使用到的這一個變數,在其它檔案中有宣告過!而在Link的時候,才會實際上把他們Link在一起啦!
以下就是一個例子,可以把extern拿掉,看是會發生什麼錯誤!
main.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  extern int x;
  printf ("value: %d\n", x);
  system("PAUSE");
  return 0;
}

common.c
int x = 2;

參考資料和詳細程式碼: C++中的extern用法

參考資料:
不懂C語言的extern是做什麼的

沒有留言: