鏈接屬性
當組成一個程序的各個源文件分別被編譯後,所有的目標文件以及那些從一個或多個函數庫中引用的函數鏈接在一起,形成可執行程序。
external | extern | 可在源文件之外訪問 |
internal | static | 只可在代碼塊內部或是函數內或是源文件內部訪問 |
none |
存儲類型
普通內存 | 代碼塊之外的變量,即爲靜態變量 |
動態堆棧 | 代碼塊內部聲明的變量 |
硬件寄存器 | 使用register聲明的變量,寄存器說明符只能用於說明函數中的變量和函數中的形參,因此不允許將外部變量或靜態變量說明爲"register"。 register型變量常用於作爲循環控制變量,這是使用它的高速特點的最佳場合 |
static的使用
函數定義 | 只修改鏈接屬性,不會改變存儲類型和作用域,簡單來說:只能在本源文件中使用 |
代碼塊之外變量的定義 | 同上 |
代碼塊內部變量的定義 | 修改了變量的存儲類型,從自動變量改爲了靜態變量。但是鏈接屬性和作用域不會改變。簡單來說:存在時間變長了,不知是在代碼塊開始執行時創建,而是在整個程序執行前創建,在程序的執行期間一直存在。 |
代碼分析:
int a=5;
extern int b;
static int c; //a,b,c均爲static變量,不會存儲於動態堆棧中。其作用域一直延伸到源文件結束爲止。但在d(int),i()兩塊代碼塊中被同名變量屏蔽,
int d(int e) //在d開始執行時,e創建,d結束時,e銷燬。
{
int f=15; //局部變量,函數結束就銷燬
register int b; //b是寄存器變量,所以它的初始值是垃圾。
static int g=20; //程序執行過程會一直存在。
extern int a; //extern可以省略,無影響
......
{
int e;
int a; //屏蔽之前聲明的a,它在這裏是不可訪問的
extern int h;
......
}
......
{
int x;
int e;
}
......
}
static int i()
{
......
}
......
編程經驗:
1.爲了保持最佳的可移植性,儘量將字符的值限制在有符號和無符號值的交集範圍之內。或者不要在字符上執行算術運算。
2.不要把整形值和枚舉一同