static變數,當變數有宣告時加上static限定時,一但變數生成,它就會一直存在記憶體之中,即使函式執行完畢,變數也不會消失,例如:
#include <stdio.h>
void count(void);
int main(void) {
int i;
for(i = 0; i < 10; i++) {
count();
}
return 0;
}
void count(void) {
static int c = 1;
printf("%d\\n", c);
c++;
}
執行結果:
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
雖然變數c是在count()函式中宣告的,但是函式結束後,變數仍然存在,它會直到程式執行結束時才消失,雖然變數一直存在,但由於它是被宣告在函式之 中,所以函式之外仍無法存取static變數。
您可以宣告全域static變數,其在程式執行期間一直存在,但在一個原始程式文件中宣告全域static變數,還表示其可以存取的範圍僅限於該原始程式文件之中,您也可以將函式宣告為static:
static void some() {
...
}
...
}
一個static函式表示,其可以呼叫的範圍限於該原始碼文件之中,如果您有一些函式僅想在該原始程式文件之中使用,則可以宣告為static,這也可以避免與其他人寫的函式名稱衝突的問題。
extern可以聲明變數會在其它的位置被定義,這個位置可能是在同一份文件之中,或是在其它文件之中,例如:
- some.c
double someVar = 1000;
// 其它定義 ...
- main.c
#include <stdio.h>
int main(void) {
extern double someVar;
printf("%f\\n", someVar);
return 0;
}
在main.c中實際上並沒有宣告someVar,extern指出someVar是在其它位置被定義,編譯器會試圖在其它位置或文件中找出 someVar的定義,結果在some.c中找到,因而會顯示結果為1000,要注意的是,extern聲明someVar在其它位置被定義,如果您 在使用extern時同時指定其值,則視為在該位置定義變數,結果就引發重覆定義錯誤,例如:
#include <stdio.h>
int main(void) {
int main(void) {
extern double someVar = 100;
// error, `someVar' has both `extern' and initializer
...
return 0;
}
return 0;
}
您必須先聲明extern找到變數,再重新指定其值,這麼使用才是正確的:
#include <stdio.h>
int main(void) {
extern double someVar;
someVar = 100;
...
return 0;
}
int main(void) {
extern double someVar;
someVar = 100;
...
return 0;
}
文章出處 :http://openhome.cc/Gossip/CGossip/Scope.html
沒有留言:
張貼留言