Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
1565 / 501 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
1

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

13.08.2012, 21:01. Показов 1409. Ответов 8
Метки нет (Все метки)

Ребят, может мне кто-нибудь объяснить назначение глобальных статических переменных? Литература (в частности Шилдт) говорит о том, что к таким переменным можно обратиться из первого файла через функцию, определенную во втором файле (вместе с глобальными статик переменными). А вот если попытаться получить доступ непосредственно (не через функцию) к этим переменным из первого файла, то получим фейл, т.к. такие переменные известна только для файла, в котором она объявлена.

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

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-ами. Или я что-то не так понял?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2012, 21:01
Ответы с готовыми решениями:

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

Заменить статические массивы на глобальные и heapalloc на new.WinApi
Есть программа,перемножающие два многочлена с помощью потоков. Коэффиценты задаются в массивах A и...

Статические переменные
В чем польза использовать статические переменные вместо обыкновенных публичных в определении...

Статические переменные
Здравствуйте, искал инфу в интернете про статические переменные. Люди говорят разные вещи про...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
8
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:08 2
Цитата Сообщение от The_Immortal Посмотреть сообщение
Честно говоря, не понимаю какой смысл несет объявление переменных статическими во втором файле, ведь доступ к ним спокойно можно получить из первого файла объявив их там extern-ами. Или я что-то не так понял?
Нельзя. Компоновщик не увидит static переменную используемую во втором файле через extern.
1
Модератор
Эксперт по электронике
8380 / 6225 / 836
Регистрация: 14.02.2011
Сообщений: 21,605
13.08.2012, 21:09 3
Цитата Сообщение от cossack5 Посмотреть сообщение
Нельзя. Компоновщик не увидит.
компоновщику и не надо, главное линкер бы увидел
1
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 21:12 4
Эм... Я вас удивлю, но линкер = компоновщик.
1
1565 / 501 / 48
Регистрация: 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;
}
0
54 / 48 / 4
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:19 6
The_Immortal,
Я говорил про доступ через extern из файла .h. Ваш пример ужасен.
1
1565 / 501 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 21:20  [ТС] 7
cossack5, ок, можно тогда нормальный пример увидеть? В книге про это ни слова.
0
Модератор
Эксперт по электронике
8380 / 6225 / 836
Регистрация: 14.02.2011
Сообщений: 21,605
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 во втором файле глобальная
а здесь локальная
1
54 / 48 / 4
Регистрация: 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/Компоновщик
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2012, 21:29

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

статические переменные
class A { public: A(){} void f() { A::_a = this; } private: static A *_a;

Глобальные переменные
Доброго времени суток всем. У меня следующая проблема: объявляю глобально переменную типа...

глобальные переменные
Пробовал объявить глобальные переменные следующим образом: в заголовочном файле head.h #ifndef...

Глобальные переменные
Здравствуйте . Разбираю пример с книги на использование глобальных переменных . Там был такой...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.