c

[C]在不同檔案間共用變數?你可以用extern阿

Posted by John on 2020-11-27
Words 784 and Reading Time 2 Minutes
Viewed Times

這篇不是教學文喔,嚴格來說是工作上發生的蠢事,因為太蠢了所以紀錄一下,順便做個筆記(寫這篇廢文的時候真的是羞愧到想挖洞把自己埋起來,我對不起大學教授我程式沒學好…咦好像也不用對不起,他也沒教什麼QQ)

好了,故事Start抖

事發總有原因,蠢事總要有人聽

總之呢,這個糗事發生在今天的上班過程中,當時的狀況是如下的,我有三份檔案:

- main.c
- api.c
- api.h

透過main.c來撰寫主要的程式碼,然後會用到的api則是放在api.c和api.h。

然後我需要透過main.c裡面的一些變數來控制api.c裡面的function,原本是想說透過call api的時候傳參數進去,大概長這樣子:

0
1
2
3
4
5
6
/* main.c */
int main()
{
int control_var = 0;
foo(control_var);

}

然後foo(int control_var)的定義跟實作在api.h / api.c中

0
1
2
/* api.h */
/* function declaration */
void foo(int control_var);
0
1
2
3
4
5
6
7
/* api.c */
/* function definition */
void foo(int control_var)
{
if (control_var) {
/* Do something */
}
}

動動你的小腦想想看

這邊涉及了幾個C語言的基本觀念,由於在寫這篇廢文的時候已經十二點半啦,明天還要上班QQ

所以先列出關鍵字讓大家搜尋,以後有機會再補上

  • 函數定義(definition) & 宣告(declaration)的差異?
  • 重複定義的思考: 為什麼通常宣告都寫在.h,而定義都寫在.cpp?
  • Variable scope?
  • File compilation & linking

「你幹嘛那麼搞工?」

總之我為了原本想好的這種寫法,大改程式碼的架構(看似簡單但其實要改的部分很多,所以要花很多時間),直到前輩跑過來看我怎麼還沒下班…然後…

「你幹嘛那麼搞工」

「因為…我想用變數去控制api的邏輯…」

「你用extern就好阿」

「…」

「…」

這個幾百年沒用過的東西才這樣慢慢浮出我腦海中,總之呢,如果用了extern,那就可以讓變數在不同檔案之間共用,只要在.h檔案中宣告

0
1
2
3
/* api.h */
/* function declaration */
void foo();
extern int control_var;

然後就可以在main.c 跟api.c中使用該變數:

0
1
2
3
4
5
/* main.c */
int main()
{
control_var = 0;
foo();
}
0
1
2
3
4
5
6
7
/* api.c */
/* function definition */
void foo()
{
if (control_var) {
/* Do something */
}
}

這樣就不用透過傳遞參數的方式來做了!

不過要注意的是要維護好該變數的值,不然可能一不注意就悲劇了,就像你的人生一樣

  • p.s. 其實這不是一個好的寫法,因為對於架構跟可讀性、維護性來說都有一些問題,不過就是紀錄一下其實還有extern可以用這樣

Extern v.s. Static

相對於Extern使得變數在不同檔案間可以被共用,Static除了改變生命週期外也有改變Scope的用途,即使得變數只在各自檔案可見

細節我就不講了,這篇文章寫得蠻好的,有興趣可以參考:

好,來睏!


>