[範例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); }
謝謝 這是一個很有用的資訊 對於我這個初學者
回覆刪除不客氣,我也是 C/C++ 初學者
刪除其實我很怕我寫錯 XD
沒include "aa.c"可以執行當中副程式??
回覆刪除您好,我這樣寫確實不好,而且沒發現沒宣告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)