2013年4月24日 星期三

C 的 extern 用法

變數使用前要先宣告(declaration),C 的 extern 關鍵字,用來表示此變數已經在別處定義(definition),告知程式到別的地方找尋此變數的定義(可能在同一個檔案或其他檔案)。


[範例1] 變數定義在同一個檔案
以下程式若無「extern int x;」,會編譯錯誤。
若僅無「extern」,雖然可以編譯成功,但效果是main()裡面宣告了一個沒有初始值的 x,印出的 x 將是不可預期的,而不是x=10。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
    extern int x;
    printf("%d\n", x);
    return (EXIT_SUCCESS);
}
int x = 10;



[範例2] 變數定義在其他檔案
以下程式若無「extern」,我測試依然可以編譯成功,查了一些資料,似乎都我沒要的答案,後來翻到我手邊有一本書寫保險一點還是要寫extern。
但是「extern」關鍵字,如果用在檔案內的全域變數似乎可有可無,這我還是不太懂。但我還是會加上「extern」,畢竟看到「extern」,至少會讓「人」知道這個變數已經在別處定義了。
[main.c]
#include <stdio.h>
#include <stdlib.h>

extern int x;

void test1() {
    int x = 11;
    printf("test1():%d\n", x);
}

void test2() {
    x = 12;
    printf("test2():%d\n", x);
}

int main(int argc, char** argv) {
    printf("main():%d\n", x); //全域x=1
    aa_test(); //全域x=1
    test1(); //test1()區域x=11
    aa_test(); //全域x=1
    test2(); //全域x=12
    aa_test(); //全域x=12
    printf("main():%d\n", x); //全域x=12
    return (EXIT_SUCCESS);
}
[aa.c]
#include <stdio.h>

int x = 1;

void aa_test() {
    printf("aa_test():%d\n", x);
}

4 則留言:

  1. 謝謝 這是一個很有用的資訊 對於我這個初學者

    回覆刪除
    回覆
    1. 不客氣,我也是 C/C++ 初學者
      其實我很怕我寫錯 XD

      刪除
  2. 沒include "aa.c"可以執行當中副程式??

    回覆刪除
    回覆
    1. 您好,我這樣寫確實不好,而且沒發現沒宣告function prototype
      我之前使用 gcc -o test main.c aa.c 編譯後,可執行沒發現怪怪的 Orz
      剛用 gcc -Wall -o test main.c aa.c,
      就會出現 warning: implicit declaration of function 'aa_test' 了

      找了一下相關資料,似乎是C比較寬鬆,才讓我這樣亂寫也可以執行 XD
      http://bbs.chinaunix.net/thread-4136506-3-1.html
      ([C] 請教一個編譯問題,不用include頭文件也可以編譯運行成功是怎麼回事? )

      http://www.ptt.cc/bbs/C_and_CPP/M.1287837412.A.B41.html
      ([問題] C語言header file新手問題)

      http://stackoverflow.com/questions/7904217/calling-a-c-function-without-prototype
      (Calling a C Function without Prototype)

      刪除