Мне очень очень жаль. Я не знал, что мое неполное вложение кода создаст такой беспорядок. Я очень рад видеть столько искренней помощи.
Этот код скомпилируется:
int myadd(int, int);
static int main_stat = 5;
int main()
{
int i, j;
main_stat = 13;
j = myadd(-1,7);
i = main_stat;
cout << j << i; // 3 and 13
return 0;
}
myadd.cpp
extern int main_stat = -3;
int myadd(int x,int y)
{
int t = main_stat;
t = x + y;
y = t +main_stat;
return y; // will return 3
}
См. Я определил и внешнюю ссылку main_stat. Почему это законно? Я думал, что вы могли только связать, а не определить.
Распределена ли память в кадре стека вызова функции myadd? Глобальная статика размещается в куче, я полагаю, верно?
EDIT
Извините, но я думаю, что на этот раз я сужу свои вопросы:
Из C ++ Primer 4ed
Объявление extern может содержать инициализатор (при объединении
становится определением), только если оно появляется вне функции.
Мне понятно правило с одним определением.
Q1. Какую копию main_stat использует myadd (int, int) при вызове? Та же копия, что и у основной, но с другим значением (которое я могу проверить)? Или каждая функция имеет свою собственную статическую глобальную копию?
Q2. Выделена ли память в куче для этих глобальных статических переменных? Я знаю, что многое зависит от реализации, но разве куча не используется для статических переменных?
Q3. Я знаю, что следующие два действительны
extern int x; // means int x is defined elsewhere
extern int x = 3; // declared and defined
Зачем нам второй, если мы можем просто объявить статическую глобальную переменную в пространстве имен myadd? Как это проясняет ситуацию , как сказал Ашеплер?