Я пытаюсь понять точное поведение спецификаторов классов хранения в 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 будет отклоняться от спецификации здесь, мне просто интересно, есть ли более глубокое объяснение этого поведения.