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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

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

30.04.2010, 23:06. Просмотров 2795. Ответов 17
Метки нет (Все метки)

прочитал что если писать 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++
Как сделать, чтобы переменная была доступна в любой части проекта? Делаю так: // test_me_1.cpp: определяет точку входа для...

Глобальная переменная - C++
Есть двумерный символьный массив ClusterBuf объявленный глобально. В него,в ходе выполнения программы, будет считываться содержимое...

Глобальная переменная - C++
Надо сделать глобальную переменную которая будет видна во всех файлах .cpp Непонятно где ее нужно инициализировать и присваивать...

Глобальная переменная - C++
#include &quot;stdafx.h&quot; #include &quot;locale&quot; #include &quot;iostream&quot; #include &quot;conio.h&quot; using namespace::std; int count = -1; void swap();...

Глобальная переменная - C++
Никогда с таким не сталкивался... В общем: Надо обьявить глобальный масив в одной функции, но чтобы его видели все другие функции. Вне...

Глобальная int - C++
Всем привет столкнулся с задачей // это &quot;some.h&quot; using namespace std; int n = 0;

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

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

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

Цитата Сообщение от accept Посмотреть сообщение
если static глобальная, её действие меняется
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.05.2010, 02:17 #13
тогда static устанавливает для переменной внутреннее связывание, для функции это также работает, что даёт возможность закрывать данное имя в еденице трансляции (файле .c)
а это, в свою очередь, даёт возможность иметь в программе функции и переменные с одинаковыми именами, которые действуют в пределах своих едениц трансляции
Evg
Эксперт CАвтор FAQ
17630 / 5854 / 376
Регистрация: 30.03.2009
Сообщений: 16,141
Записей в блоге: 26
03.05.2010, 10:20 #14
accept, всё, что ты написал, в равной степени относится к static'у внутри функции. Модуль - это такая же область видимости, как и функция или лексический блок. Разве что явных фигурных скобок нет. Т.е. мысль из поста #4 в равной степени распространяется на все static'и
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.05.2010, 10:38 #15
Цитата Сообщение от Evg
accept, всё, что ты написал, в равной степени относится к static'у внутри функции. Модуль - это такая же область видимости, как и функция или лексический блок.
объявив переменную в модуле, её область видимости не будет распространяться только на этот модуль, если бы это было так, то static для глобальных переменных не стали бы делать (зачем делать то, что и так само по себе работает)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 10:38
Привет! Вот еще темы с ответами:

Глобальная перезагрузка операторов - C++
Есть код: template&lt; class Value &gt; class MyClass { Value value_; }; template&lt; class V &gt;

Глобальная переменная в OpenCL - C++
Всем привет! Кто может подсказать как правильно создать глобальную переменную в OpenCL? unsigned char *globalVariable; __kernel...

Глобальная ф-ция getline - C++
Всем добрый вечер :) Вообщем есть кусок кода: // read for name vector while (std::getline(std::cin, name)) { ...

Глобальная переменная из другой dll - C++
Имеется сторонняя dll без исходников. Мне нужно в своей программе получить значение глобальной переменной из той длл. Через IDA нашел,...


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

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

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