Форум программистов, компьютерный форум CyberForum.ru

Глобальные статические переменные - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 21:01     Глобальные статические переменные #1
Ребят, может мне кто-нибудь объяснить назначение глобальных статических переменных? Литература (в частности Шилдт) говорит о том, что к таким переменным можно обратиться из первого файла через функцию, определенную во втором файле (вместе с глобальными статик переменными). А вот если попытаться получить доступ непосредственно (не через функцию) к этим переменным из первого файла, то получим фейл, т.к. такие переменные известна только для файла, в котором она объявлена.

Пример "расчет среднего значения цепочки введенных чисел" (из книги):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//---------------------- Первый файл ---------------------------------
#include <iostream>
using namespace std;
 
int r_avg(int);
 
int _tmain(int argc, _TCHAR* argv[]) {
    int num;
    do {
        cin >> num;
        cout << r_avg(num);
        cout << '\n';
 
    }
    while (num != -1);
 
    system("pause");
}
 
 
//---------------------- Второй файл ---------------------------------
static int sum = 0, count = 0; // !!!
 
int r_avg(int i) {
    sum = sum + i;
    count++;
    return sum / count;
}
Честно говоря, не понимаю какой смысл несет объявление переменных статическими во втором файле, ведь доступ к ним спокойно можно получить из первого файла объявив их там extern-ами. Или я что-то не так понял?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 21:01     Глобальные статические переменные
Посмотрите здесь:

C++ Глобальные переменные
C++ глобальные переменные
Глобальные и статические глобальные переменные C++
C++ Глобальные переменные
Глобальные переменные C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:08     Глобальные статические переменные #2
Цитата Сообщение от The_Immortal Посмотреть сообщение
Честно говоря, не понимаю какой смысл несет объявление переменных статическими во втором файле, ведь доступ к ним спокойно можно получить из первого файла объявив их там extern-ами. Или я что-то не так понял?
Нельзя. Компоновщик не увидит static переменную используемую во втором файле через extern.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.08.2012, 21:09     Глобальные статические переменные #3
Цитата Сообщение от cossack5 Посмотреть сообщение
Нельзя. Компоновщик не увидит.
компоновщику и не надо, главное линкер бы увидел
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 21:12     Глобальные статические переменные #4
Эм... Я вас удивлю, но линкер = компоновщик.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 21:15  [ТС]     Глобальные статические переменные #5
Цитата Сообщение от cossack5 Посмотреть сообщение
Нельзя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//---------------------- Первый файл ---------------------------------
#include <iostream>
#include <File2.cpp>
 
using namespace std;
 
int r_avg(int);
 
int _tmain(int argc, _TCHAR* argv[]) {
    extern int count; // тырим из 2го файла
    int num;
    do {
        cin >> num;
        cout << r_avg(num) << ' ' << count; // выводим этот static int count 
        cout << '\n';
 
    }
    while (num != -1);
 
    system("pause");
}
 
 
//---------------------- Второй файл (File2.cpp) ---------------------------------
static int sum = 0, count = 0; // !!!
 
int r_avg(int i) {
    sum = sum + i;
    count++;
    return sum / count;
}
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:19     Глобальные статические переменные #6
The_Immortal,
Я говорил про доступ через extern из файла .h. Ваш пример ужасен.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 21:20  [ТС]     Глобальные статические переменные #7
cossack5, ок, можно тогда нормальный пример увидеть? В книге про это ни слова.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
13.08.2012, 21:22     Глобальные статические переменные #8
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Я вас удивлю, но линкер = компоновщик.
значит не правильно меня учили
компоновщик - компилятор а линкер это линкер(линковщик)

Цитата Сообщение от The_Immortal Посмотреть сообщение
#include <File2.cpp>
вот не вздумай, ошибок огребешь

Цитата Сообщение от The_Immortal Посмотреть сообщение
extern int count; // тырим из 2го файла
вот это говорит компилятору что count определена в другом блоке где её и найдет линковшик, которому твои include по барабану

Цитата Сообщение от The_Immortal Посмотреть сообщение
int _tmain(int argc, _TCHAR* argv[]) {
extern int count; // тырим из 2го файла
как вот так тырим???
count во втором файле глобальная
а здесь локальная
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 21:29     Глобальные статические переменные
Еще ссылки по теме:

Глобальные переменные C++
Глобальные переменные C++
C++ Глобальные переменные

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:29     Глобальные статические переменные #9
Цитата Сообщение от The_Immortal Посмотреть сообщение
cossack5, ок, можно тогда нормальный пример увидеть? В книге про это ни слова.
C++
1
2
3
4
5
6
7
8
9
10
11
file 1.h
extern int variable;
file 1.cpp
static int variable=2;
file 2.cpp
#include "1.h"
int main()
{
variable=5;
return 0;
};
Добавлено через 1 минуту
Вообще без 1.h можно обойтись

Добавлено через 52 секунды
Цитата Сообщение от ValeryS Посмотреть сообщение
компоновщик - компилятор а линкер это линкер(линковщик)
http://ru.wikipedia.org/wiki/Компоновщик
Yandex
Объявления
13.08.2012, 21:29     Глобальные статические переменные
Ответ Создать тему
Опции темы

Текущее время: 11:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru