---
# System prepended metadata

title: 'C/C++: extern, static, const用法'
tags: [C/C++]

---

###### tags: `C/C++`

# C/C++: extern, static, const用法
## extern用法
- 為了讓多個檔案能存取同個變數，C++區分宣告(Declaration)以及定義(Definition)。
- 變數可以宣告很多次，但只能定義一次。

可以使用extern宣告而不定義。
```
extern int i;  // 宣告但不定義i
int i;         // 宣告且定義i
```
如果出現初值，就被當作定義式，即使被標示為extern
```
extern double pi = 3.14;  // 這是定義式
```
宣告方式：
```
extern int a = 100;  // 錯誤
extern int a;        // 正確
a = 100;
```
Reference: C++ Primer 4/e p. 52

function使用也是相同的。
如果想在main.c使用在foo.c中定義的void foo()，只需要extern宣告：
```
extern void foo();
```

## static用法
1. static出現在區域變數前。
    * static variable存活時間和整個程式一樣長，在編譯時就配有固定的記憶體空間，scope則維持不變，即function結束為止。
    * 若funtion再次被呼叫，其值會被保留下來。
2. static出現在funtion或是全域變數前。
    * static可以侷限變數/函式只在本檔案使用，如此就不會被extern拿來連結。
3. class的使用

References: 
[1]
https://medium.com/@alan81920/c-c-%E4%B8%AD%E7%9A%84-static-extern-%E7%9A%84%E8%AE%8A%E6%95%B8-9b42d000688f
[2] http://kamory0931.pixnet.net/blog/post/119201381
[3] https://openhome.cc/Gossip/CGossip/Scope.html


## const用法
1. 使物件變成常數。
2. 預設下const物件為local to file。
    * 在global定義一nonconst，另一檔案也可使用(extern用法)。除非有指明，否則golbal域下宣告的const只能在所在的檔案可見。
    * 可以將const物件指明為extern，使其在其他檔案也可使用。

References: C++ Primer 4/e p.57

