這篇不是教學文喔,嚴格來說是工作上發生的蠢事,因為太蠢了所以紀錄一下,順便做個筆記(寫這篇廢文的時候真的是羞愧到想挖洞把自己埋起來,我對不起大學教授我程式沒學好…咦好像也不用對不起,他也沒教什麼QQ)
好了,故事Start抖
事發總有原因,蠢事總要有人聽
總之呢,這個糗事發生在今天的上班過程中,當時的狀況是如下的,我有三份檔案:
- main.c |
透過main.c來撰寫主要的程式碼,然後會用到的api則是放在api.c和api.h。
然後我需要透過main.c裡面的一些變數來控制api.c裡面的function,原本是想說透過call api的時候傳參數進去,大概長這樣子:
0 | /* main.c */ |
然後foo(int control_var)
的定義跟實作在api.h / api.c中
0 | /* api.h */ |
0 | /* api.c */ |
動動你的小腦想想看
這邊涉及了幾個C語言的基本觀念,由於在寫這篇廢文的時候已經十二點半啦,明天還要上班QQ
所以先列出關鍵字讓大家搜尋,以後有機會再補上
- 函數定義(definition) & 宣告(declaration)的差異?
- 重複定義的思考: 為什麼通常宣告都寫在.h,而定義都寫在.cpp?
- Variable scope?
- File compilation & linking
「你幹嘛那麼搞工?」
總之我為了原本想好的這種寫法,大改程式碼的架構(看似簡單但其實要改的部分很多,所以要花很多時間),直到前輩跑過來看我怎麼還沒下班…然後…
「你幹嘛那麼搞工」
「因為…我想用變數去控制api的邏輯…」
「你用extern就好阿」
「…」
「…」
這個幾百年沒用過的東西才這樣慢慢浮出我腦海中,總之呢,如果用了extern,那就可以讓變數在不同檔案之間共用,只要在.h檔案中宣告
0 | /* api.h */ |
然後就可以在main.c 跟api.c中使用該變數:
0 | /* main.c */ |
0 | /* api.c */ |
這樣就不用透過傳遞參數的方式來做了!
不過要注意的是要維護好該變數的值,不然可能一不注意就悲劇了,就像你的人生一樣。
- p.s. 其實這不是一個好的寫法,因為對於架構跟可讀性、維護性來說都有一些問題,不過就是紀錄一下其實還有extern可以用這樣
Extern v.s. Static
相對於Extern使得變數在不同檔案間可以被共用,Static除了改變生命週期外也有改變Scope的用途,即使得變數只在各自檔案可見
細節我就不講了,這篇文章寫得蠻好的,有興趣可以參考:
好,來睏!