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

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

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

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

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

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

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

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

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

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

Глобальные переменные - C++
Я хочу использовать глобальную переменную, определённую в main, в своих классах. Листинг)) globals.h #ifndef GLOBASL_H #define...

8
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:08 #2
Цитата Сообщение от The_Immortal Посмотреть сообщение
Честно говоря, не понимаю какой смысл несет объявление переменных статическими во втором файле, ведь доступ к ним спокойно можно получить из первого файла объявив их там extern-ами. Или я что-то не так понял?
Нельзя. Компоновщик не увидит static переменную используемую во втором файле через extern.
1
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
13.08.2012, 21:09 #3
Цитата Сообщение от cossack5 Посмотреть сообщение
Нельзя. Компоновщик не увидит.
компоновщику и не надо, главное линкер бы увидел
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 21:12 #4
Эм... Я вас удивлю, но линкер = компоновщик.
1
The_Immortal
1552 / 488 / 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;
}
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
13.08.2012, 21:19 #6
The_Immortal,
Я говорил про доступ через extern из файла .h. Ваш пример ужасен.
1
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 21:20  [ТС] #7
cossack5, ок, можно тогда нормальный пример увидеть? В книге про это ни слова.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
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
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/Компоновщик
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 21:29
Привет! Вот еще темы с ответами:

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

глобальные переменные - C++
здравствуйте, я только начал изучать C++, в книге Штидта Г. есть такой код, он выводит: count + число, помогите понять принцип работы этого...

Глобальные переменные - C++
Я правильно понимаю: &quot;в c++ использовать глобальные переменные не безопасно, т. к. др. программы могут случайно поменять значение этих...

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


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
13.08.2012, 21:29
Ответ Создать тему
Опции темы

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