Я пытаюсь понять точное поведение спецификаторов класса хранения в C99, и некоторые действия GCC, кажется, не соответствуют спецификации, если только я не понимаю спецификацию неправильно. Из 6.2.2 (2):
В пределах одной единицы перевода каждое объявление идентификатора с внутренней связью обозначает один и тот же объект или функцию.
Однако я протестировал GCC (powerpc-apple-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
Я понимаю, почему GCC отклоняется от спецификации здесь, мне просто интересно, есть ли более глубокое объяснение такого поведения.