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

static и глобальная видимость - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
30.04.2010, 23:06     static и глобальная видимость #1
прочитал что если писать static int a = 5; то a будет видно ото всюду но оказалосбь это не так...

C++
1
2
3
4
5
6
7
8
9
10
void a();
 
int main() {
static int a = 5;
a();
}
 
void a() {
cout <<a;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2010, 23:06     static и глобальная видимость
Посмотрите здесь:

C++ Глобальная переменная
C++ Глобальная переменная
C++ Глобальная ф-ция getline
Глобальная переменная C++
глобальная переменная из другой dll C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
30.04.2010, 23:36     static и глобальная видимость #2
Где вы такое прочитали?
Насколько я знаю - на статическую переменную действуют те же правила видимости что и на остальные.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
01.05.2010, 00:33     static и глобальная видимость #3
Цитата Сообщение от Krist_ALL Посмотреть сообщение
прочитал что если писать static int a = 5; то a будет видно ото всюду но оказалосбь это не так...
С точки зрения видимости переменная static ничем не отличается от остальных. Под "видимостью" подразумевается языковая видимость, а не межмодульная. Если переменная объявлена в локальном контексте (внутри функции или лексического блока), то "видна" одна только из этого блока, но при этом является глобальной переменной с временем жизни "вся программа"

С примерами объяснял здесь Отличие static от объявление переменных ДО функции main
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.05.2010, 08:03     static и глобальная видимость #4
Цитата Сообщение от Krist_ALL
прочитал что если писать static int a = 5; то a будет видно ото всюду
`a' будет видно только в блоке, а значение `a' будет видно отовсюду
поэтому, чтобы получить доступ к этому значению, нужно из функции вернуть адрес этой переменной

если static глобальная, её действие меняется
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
01.05.2010, 11:02     static и глобальная видимость #5
Цитата Сообщение от accept Посмотреть сообщение
если static глобальная, её действие меняется
static локальная и static глобальная вообще ничем не отличаются. Только областью видимости. "Её действие меняется" - неверно
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
01.05.2010, 12:54     static и глобальная видимость #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Evg Посмотреть сообщение
..... но при этом является глобальной переменной с временем жизни "вся программа"
Это не вполне верно. В соответствии с точным смыслом Стандарта, время жизни такой переменной гарантированно начинается только с момента первого прохождения потока управления через ее объявление, и заканчивается с окончанием программы. То есть, если, например, статическая переменная объявлена в блоке (функции), а функция эта никогда не вызывается (поток управления никогда через нее не проходит), то эта переменная может никогда не "ожить" вообще :-)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
01.05.2010, 14:32     static и глобальная видимость #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от CheshireCat Посмотреть сообщение
Это не вполне верно. В соответствии с точным смыслом Стандарта, время жизни такой переменной гарантированно начинается только с момента первого прохождения потока управления через ее объявление, и заканчивается с окончанием программы. То есть, если, например, статическая переменная объявлена в блоке (функции), а функция эта никогда не вызывается (поток управления никогда через нее не проходит), то эта переменная может никогда не "ожить" вообще :-)
Опять как в вопросе про строго зафиксированный порядок выполнения операций, мы смотрим на проблему с разных колоколен. То, что сказал я - справедливо для Си. То, что сказал ты - справедливо для Си++. Для новичков всё-таки переведу твои слова на более понятный язык. Грубо говоря, если у нас в функции объявлена переменная типа класс, то в случае, если мы функцию ни разу не вызвали, то конструктор (и, соответственно, деструктор) для этой переменной не будут вызваны вообще. А если в функцию (или лексический блок) заходили, то при первом попадании в область видимости объекта будет вызван конструктор. С этой позиции разница между Си и Си++ в том, что в Си есть только статическая инициализация, а в Си++ есть ещё и динамическая: компилятор обеспечивает вызов конструкторов для всех переменных с глобальным временем жизни.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
01.05.2010, 22:03     static и глобальная видимость #8
Вывернулся таки, хитрец! :-) Вот за что приятно с тобой дискутировать - так это за полностью корректные и спокойные контрагрументы.
Хорошо, поправка (уточнение) принята. Полагаю, отныне консенсус.
Chajnik
1 / 1 / 0
Регистрация: 05.03.2010
Сообщений: 8
01.05.2010, 22:18     static и глобальная видимость #9
Просто время жизни ограничивается с момента объявления до конца работы программы,
т.е. если к примеру она( переменная) объявляется в какой-то функции, с ней производятся операции,
при последующем вызове этой ф-и она будет иметь то же значение, что имела при завершении работы ф-и в прошлый раз: что-то типа счетчика, короче.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
01.05.2010, 23:17     static и глобальная видимость #10
Цитата Сообщение от CheshireCat Посмотреть сообщение
Вывернулся таки, хитрец!
Я не то чтоб выворачивался, я просто признал, что облажался (хотя полсле прочтения и вправду выглядит, как будто бы вывернулся). Просто я на Си программирую и у меня мышление на Си завязано. А потому в таких вопросах попросту забываю, что в Си++ есть много различий
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.05.2010, 08:07     static и глобальная видимость #11
Цитата Сообщение от Evg
static локальная и static глобальная вообще ничем не отличаются. Только областью видимости. "Её действие меняется" - неверно
глобальная переменная уже статическая и слово static используется для такой переменной для другой цели
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
02.05.2010, 10:05     static и глобальная видимость #12
Цитата Сообщение от accept Посмотреть сообщение
глобальная переменная уже статическая и слово static используется для такой переменной для другой цели
Тогда поясни, что означала фраза

Цитата Сообщение от accept Посмотреть сообщение
если static глобальная, её действие меняется
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.05.2010, 02:17     static и глобальная видимость #13
тогда static устанавливает для переменной внутреннее связывание, для функции это также работает, что даёт возможность закрывать данное имя в еденице трансляции (файле .c)
а это, в свою очередь, даёт возможность иметь в программе функции и переменные с одинаковыми именами, которые действуют в пределах своих едениц трансляции
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
03.05.2010, 10:20     static и глобальная видимость #14
accept, всё, что ты написал, в равной степени относится к static'у внутри функции. Модуль - это такая же область видимости, как и функция или лексический блок. Разве что явных фигурных скобок нет. Т.е. мысль из поста #4 в равной степени распространяется на все static'и
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.05.2010, 10:38     static и глобальная видимость #15
Цитата Сообщение от Evg
accept, всё, что ты написал, в равной степени относится к static'у внутри функции. Модуль - это такая же область видимости, как и функция или лексический блок.
объявив переменную в модуле, её область видимости не будет распространяться только на этот модуль, если бы это было так, то static для глобальных переменных не стали бы делать (зачем делать то, что и так само по себе работает)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
03.05.2010, 10:51     static и глобальная видимость #16
Цитата Сообщение от accept Посмотреть сообщение
объявив переменную в модуле, её область видимости не будет распространяться только на этот модуль
Если выделенное жирным удалить, то будет верно. А в том виде, в которым ты написал - нет
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.05.2010, 11:45     static и глобальная видимость #17
Цитата Сообщение от Evg
Если выделенное жирным удалить, то будет верно.
открой словарь, слово буквоед посмотри
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 12:01     static и глобальная видимость
Еще ссылки по теме:

Глобальная перезагрузка операторов C++
C++ Глобальная видимость переменной в проекте
C++ Глобальная переменная

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
03.05.2010, 12:01     static и глобальная видимость #18
accept, я не занимаюсь буквоедством, я просто пытаюсь понять, что ты сказал в 4-м посте. Если в 15-м посте наличие "не" было опечаткой, то так бы и сказал.
Yandex
Объявления
03.05.2010, 12:01     static и глобальная видимость
Ответ Создать тему
Опции темы

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