我想了解C99中的存儲類說明符的確切行爲,有些GCC行爲似乎不遵循規範,除非我誤解了規範。從6.2.2(2):C中的鏈接:GCC是否遵循C99規範,或者我不理解規範?
內的一個翻譯單元,標識符的每個聲明與內部聯動表示相同對象或功能。
然而,我與以下程序測試GCC(PowerPC的蘋果darwin9-GCC-4.2.1):
#include <stdio.h>
static int f() {
static int x = 0;
return x++;
}
static int g() {
static int x = 0;
return x++;
}
int main(int argc, char *argv[]) {
printf("g() = %i\n", g());
printf("g() = %i\n", g());
printf("f() = %i\n", f());
printf("f() = %i\n", f());
return 0;
}
與-std=c99
編譯,它打印出以下內容:
g() = 0
g() = 1
f() = 0
f() = 1
如果我正確理解規格,應該打印:
g() = 0
g() = 1
f() = 2
f() = 3
我明白爲什麼海灣合作委員會會偏離這裏的規範,我只是想知道這個行爲是否有更深的解釋。
換句話說,每個x都是聲明它的函數的局部。 – 2010-01-29 03:11:30
謝謝。很容易遺漏規範中的單詞。 – 2010-01-29 03:19:55
@Dietrich:是的。事實上,這很容易,我錯過了更相關和重要的部分,作爲答案張貼。 – 2010-01-29 04:06:50