1.auto
這個這個關鍵字用於聲明變量的生存期為自動,即將不在任何類、結構、枚舉、聯合和函數中定義的變量視為全局變量,而在函數中定義的變量視為局部變量。這個關鍵字不怎么多寫,因為所有的變量默認就是auto的。

int func(){ auto int a; return 1; } auto int b = 22; int main(int argc, char const *argv[]) { printf("%d\n", b); return 0; } /* mainc.c:7:10: error: file-scope declaration of 'b' specifies 'auto' auto int b = 22; */
2.register
這個關鍵字命令編譯器盡可能的將變量存在CPU內部寄存器中而不是通過內存尋址訪問以提高效率。

int main(int argc, char const *argv[]) { register int b = 10; printf("%d\n", b); printf("%p\n", &b); return 0; } /* mainc.c: In function 'main': mainc.c:13:2: error: address of register variable 'b' requested printf("%p\n", &b); */
3.static
3.1 static 存儲類指示編譯器在程序的生命周期內保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創建和銷毀。因此,使用 static 修飾局部變量可以在函數調用之間保持局部變量的值。
3.2 static 修飾符也可以應用於全局變量。當 static 修飾全局變量時,會使變量的作用域限制在聲明它的文件內。
3.3 static 是全局變量的默認存儲類
4.extern
4.1 extern 存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當您使用 'extern' 時,對於無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。
4.2 當您有多個文件且定義了一個可以在其他文件中使用的全局變量或函數時,可以在其他文件中使用 extern 來得到已定義的變量或函數的引用。可以這么理解,extern 是用來在另一個文件中聲明一個全局變量或函數。
extern 修飾符通常用於當有兩個或多個文件共享相同的全局變量或函數的時候
// main.c
#include <stdio.h> int count ; extern void write_extern(); int main() { count = 5; write_extern(); } // a.c #include <stdio.h> extern int count; void write_extern(void) { printf("count is %d\n", count); }
參考資料:https://www.cnblogs.com/candyming/archive/2011/11/25/2262826.html
http://www.runoob.com/cprogramming/c-storage-classes.html
