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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
The_Immortal
1551 / 487 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
#1

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

13.08.2012, 21:01. Просмотров 1088. Ответов 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-ами. Или я что-то не так понял?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 21:01     Глобальные статические переменные
Посмотрите здесь:

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

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

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

Статические переменные - C++
В чем польза использовать статические переменные вместо обыкновенных публичных в определении класса. К примеру: class record { ...

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

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

Глобальные переменные - C++
Здравствуйте . Разбираю пример с книги на использование глобальных переменных . Там был такой пример: #include &quot;stdafx.h&quot; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:08     Глобальные статические переменные #2
Цитата Сообщение от The_Immortal Посмотреть сообщение
Честно говоря, не понимаю какой смысл несет объявление переменных статическими во втором файле, ведь доступ к ним спокойно можно получить из первого файла объявив их там extern-ами. Или я что-то не так понял?
Нельзя. Компоновщик не увидит static переменную используемую во втором файле через extern.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,727
13.08.2012, 21:09     Глобальные статические переменные #3
Цитата Сообщение от cossack5 Посмотреть сообщение
Нельзя. Компоновщик не увидит.
компоновщику и не надо, главное линкер бы увидел
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 21:12     Глобальные статические переменные #4
Эм... Я вас удивлю, но линкер = компоновщик.
The_Immortal
1551 / 487 / 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
1551 / 487 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 21:20  [ТС]     Глобальные статические переменные #7
cossack5, ок, можно тогда нормальный пример увидеть? В книге про это ни слова.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,727
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++
Я хочу использовать глобальную переменную, определённую в main, в своих классах. Листинг)) globals.h #ifndef GLOBASL_H #define...

Глобальные переменные - C++
Здравствуйте! Возникла видимо классическая проблема, но перечитав кучу сайтов так ее и не решил. Пишу в VS2005, имеются 2 срр файла...

Глобальные переменные - C++
Как в C++ завести глобальную (общую для функции и самой программы) переменную?

Глобальные переменные - C++
Я правильно понимаю: &quot;в 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     Глобальные статические переменные
Ответ Создать тему
Опции темы

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