Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на статическую внутреннюю переменную 
:(
    Опции темы
Random13
Дата 4.12.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Такой вопрос.
Видел как один чел использовал в программе указатель на статическую переменную из функции.
То есть есть просто функция (не метод) в одном из файлов проекта. Он из нее возвращает указатель на внутреннюю статическую переменную. Я у себя проверил - работает. Функцию имплементировал в одном из файлов проекта, в другом в мэйн ее использовал.
В связи с этим вопрос - не понятно. Есть ли это в ANSI С, то есть работает ли во всех компиляторах ?
То есть по своему назначению внутренняя статическая переменная служит для нужд функции, но никак не для работы наруже. Вообще есть правило, что область видимости статической переменной ограничивается файлом, где она объявлена. Получается, что передавая на нее поинтер это правило можно обойти, и вообще сливается грань между внутренней и глобальной статической переменной.
Я пришел к мнению, что использовать такое, наверное, можно, но не корректно...
Кто что думает - интрересно почитать.
PM MAIL   Вверх
zkv
Дата 4.12.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



я использую, там где считаю необходимым, ничего незаконного не вижу в этом, 
пример:
Код

const std::string &ApplicationPath()
{
  static std::string path;
  if( path.empty() )
  {
   //единожды инициализируется 
   }
   return path;
}

PM MAIL   Вверх
Lazin
Дата 4.12.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Так часто реализуют шаблон проектирования "синглтон"
Код

Object* QuerySingleton()
{
    static Object singleton;
    return &singleton;
}

PM MAIL Skype GTalk   Вверх
zkv
Дата 4.12.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Lazin @  4.12.2007,  13:35 Найти цитируемый пост)
Так часто реализуют шаблон проектирования "синглтон"

это только один из вариантов
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Random13 @  4.12.2007,  13:24 Найти цитируемый пост)
В связи с этим вопрос - не понятно. Есть ли это в ANSI С, то есть работает ли во всех компиляторах ?

это служит намного более удобным заменителем глобальной переменной
Цитата(Random13 @  4.12.2007,  13:24 Найти цитируемый пост)
То есть по своему назначению внутренняя статическая переменная служит для нужд функции, но никак не для работы наруже.

наруже она нужна, но сделано так, что полностью контролируется доступ к ней, а не бесконстрольное считывание/запись в случае просто глобальной переменной

PM MAIL   Вверх
Random13
Дата 4.12.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



В этом варианте все в порядке - там возвращается статическая переменная класса, а не внутренняя переменная метода.
Нигде в литературе не видел, чтобы возвращалась внутренняя статическая.
PM MAIL   Вверх
zkv
Дата 4.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Random13 @  4.12.2007,  13:59 Найти цитируемый пост)
В этом варианте все в порядке - там возвращается статическая переменная класса, а не внутренняя переменная метода.

в каком варианте?
PM MAIL   Вверх
Random13
Дата 4.12.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



В твоем

Добавлено @ 14:19
Цитата(zkv @ 4.12.2007,  13:39)
Цитата(Lazin @  4.12.2007,  13:35 Найти цитируемый пост)
Так часто реализуют шаблон проектирования "синглтон"

это только один из вариантов



Это сообщение отредактировал(а) Random13 - 4.12.2007, 14:20
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Random13 @  4.12.2007,  13:59 Найти цитируемый пост)
В этом варианте все в порядке - там возвращается статическая переменная класса, а не внутренняя переменная метода.Нигде в литературе не видел, чтобы возвращалась внутренняя статическая.



Цитата(Random13 @  4.12.2007,  13:24 Найти цитируемый пост)
Видел как один чел использовал в программе указатель на статическую переменную из функции.То есть есть просто функция (не метод) в одном из файлов проекта. Он из нее возвращает указатель на внутреннюю статическую переменную. Я у себя проверил - работает. Функцию имплементировал в одном из файлов проекта, в другом в мэйн ее использовал.

ну вот увидел.
PM MAIL   Вверх
Random13
Дата 4.12.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Если я увидел, что кто-то, что то делает - то не значит, что это правильно и корректно и везде будет работать.
В литературе по этому поводу ничего не читал никогда.
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Random13 @  4.12.2007,  15:07 Найти цитируемый пост)
Если я увидел, что кто-то, что то делает - то не значит, что это правильно и корректно и везде будет работать.

тебе же сказали - вполне юзабельное решение. Ничего неправильного с точки зрения языка в таком варианте реализации нет
PM MAIL   Вверх
Earnest
Дата 4.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Random13 @  4.12.2007,  16:07 Найти цитируемый пост)
В литературе по этому поводу ничего не читал никогда. 

Возврат ссылки или указателя на статическую переменную, объявленную внутри функции совершенно корректен.
На конкретный пункт стандарта сослаться не могу, но и в литературе ссылки встречаются. Например, у Майерса или у Саттера. Или описание реализации синглетона из книги банды четырех.

Более того, это шикарный прием для обхода проблемы "инициализации вовремя": как известно, порядок инициализации нормальных (внешних) глобальных или статических переменных из разных единиц компиляции неопределен. И легального способа добиться, чтобы переменная A была инициализирована гарантированно раньше переменной B не существует - если они в разных модулях. 

Т.е. мы получим проблему, если инициализация A зависит от B.
А если вместо глобальной переменной мы используем ссылку на статическую переменную внутри функции, то она гарантированно будет инициализирована ровно в момент первого вызова - т.е. когда нам надо. И это стандарт гарантирует.


--------------------
...
PM   Вверх
zkv
Дата 4.12.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Random13 @  4.12.2007,  15:07 Найти цитируемый пост)
В литературе по этому поводу ничего не читал никогда. 

В литературе обо всем не напишешь, можно еще и голову применять. 
К тому же тебе показали два примера, объяснили достоинства подхода, что еще нужно?
PM MAIL   Вверх
Random13
Дата 4.12.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



А я скажу, что - это некорректно.
Мало кто чего говорит. Ну недоверчивый я такой, когда дело идет о таких вещах.
Мне бы почитать где об этом. На душе бы полегчало.  smile 
PM MAIL   Вверх
bsa
Дата 4.12.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Random13, тебе сказали, где читать.
PM   Вверх
zkv
Дата 4.12.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Random13 @  4.12.2007,  15:26 Найти цитируемый пост)
А я скажу, что - это некорректно.

ок, а что рождает сомнения? Изложи их, попробуем развеять.  smile 
PM MAIL   Вверх
Random13
Дата 4.12.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(zkv @ 4.12.2007,  15:23)
Цитата(Random13 @  4.12.2007,  15:07 Найти цитируемый пост)
В литературе по этому поводу ничего не читал никогда. 

В литературе обо всем не напишешь, можно еще и голову применять. 
К тому же тебе показали два примера, объяснили достоинства подхода, что еще нужно?

Если возможность недокументированная, значит опасная.

Если нет в ANSI, значит есть вероятность существования компилятора, в котором это не будет работать.
И какие могут быть претензии к создателю компилятора при этом, если этого нет в стандарте ?

Добавлено через 5 минут и 57 секунд
Первое сомнение изложил.
Второе, всегда в литературе почему-то работают с динамической памятью , где с указателем на статические внутренние переменные получается удобней.
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Random13 @  4.12.2007,  15:37 Найти цитируемый пост)
Если недокументированная, значит опасная.

вернуть адрес из функции - то по твоему "возможность недокументированная" ?


PM MAIL   Вверх
zkv
Дата 4.12.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Random13 @  4.12.2007,  15:37 Найти цитируемый пост)
Если возможность недокументированная, значит опасная.

Если нет в ANSI, значит есть вероятность существования компилятора, в котором это не будет работать.
И какие могут быть претензии к создателю компилятора при этом, если этого нет в стандарте ? 

чего это нет в стандарте? Там есть упоминание о том, что время жизни такой переменной - время выполнения программы? Есть. 
Значит она там будет всегда, когда бы мы к ней не обратились.
Да она сама (статическая переменная) не видна вне функции, в которой объявлена, и против этого  мы тоже не идем, мы ведь не пытаемся увеличить видимость переменной (дико звучит  smile ) а передаем на нее указатель/ссылку.
Что незаконного в действиях?

Цитата(Random13 @  4.12.2007,  15:37 Найти цитируемый пост)
Если возможность недокументированная, значит опасная.

теперь когда будешь говорить о недокументированности, уточняй, в каком именно месте мы расходимся с документацией  smile 
PM MAIL   Вверх
Lazin
Дата 4.12.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Статическая переменная внутри метода отличается от глобальной переменной(статической) только видимостью.
У Александресску хорошо описана эта проблема. Недостаток этого подхода(достоинство?) - тип переменной определен на этапе компиляции, и нельзя контролировать время жизни такой переменной. Могут быть траблы, если есть несколько статических переменных (не тривиальных типов) и одна обращается к другой в своем деструкторе, а та уже уничтожена.
PM MAIL Skype GTalk   Вверх
Earnest
Дата 4.12.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Lazin @  4.12.2007,  16:58 Найти цитируемый пост)
. Недостаток этого подхода(достоинство?) - тип переменной определен на этапе компиляции, и нельзя контролировать время жизни такой переменной. Могут быть траблы, если есть несколько статических переменных (не тривиальных типов) и одна обращается к другой в своем деструкторе, а та уже уничтожена

Это все в равной степени относится и к глобальным переменным. Собственно, статическая переменная внутри функции отличается только тем, что можно контролировать время создания. 
Насчет "Тип определен во время компиляции" - не совсем так: кто мешает иметь указатель и инициализировать его (по запросу) исходя из каких-либо условий? Элементарно, если понадобиться. Т.е. никаких отличий от любого другого полиморфного указателя.


--------------------
...
PM   Вверх
bsa
Дата 4.12.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А разве деструкторы статических объектов вызываются не в порядке, обратном вызову конструкторов? Так реализовать проще, имхо.
PM   Вверх
Random13
Дата 4.12.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 4.12.2007,  15:23)
Более того, это шикарный прием для обхода проблемы "инициализации вовремя": как известно, порядок инициализации нормальных (внешних) глобальных или статических переменных из разных единиц компиляции неопределен. И легального способа добиться, чтобы переменная A была инициализирована гарантированно раньше переменной B не существует - если они в разных модулях. 

Т.е. мы получим проблему, если инициализация A зависит от B.
А если вместо глобальной переменной мы используем ссылку на статическую переменную внутри функции, то она гарантированно будет инициализирована ровно в момент первого вызова - т.е. когда нам надо. И это стандарт гарантирует.

Не совсем понятно.  Все глобальные переменные инициализируются до мейн(), функцию любую можно вызвать только после входа в мейн(). Ну или до мэйн() можно при создании глобального объекта вызвать внешнюю функцию из конструктора.
Тогда при чем тут порядок инициализации ? С тем же успехом можно либо в мэйн() вначале задать значение А, и В(А). Либо сделать это в той же функции при построении глобального объекта.
В общем интересно. Как-нить может сам набреду на пример.  smile 
PM MAIL   Вверх
zkv
Дата 4.12.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Random13, имеется ввиду нечто подобное:
Код

//1.cpp
Class1 g_val1;

//2.cpp
extern Class1 g_val1;

Class1 g_val2( g_val1 );//вот тут можно наступить на грабли, нельзя определенно сказать, будет в этот момент создан объект g_val1 или нет

ну и по аналогии со статическими переменными та же история.
PM MAIL   Вверх
bsa
Дата 4.12.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



вот о чем речь: файл aaa.cpp:
Код
#include <iostream>
struct A
{
        A() { std::cout << "A" << std::endl; }
};
A a;
файл bbb.cpp:
Код
#include <iostream>
struct B
{
        B() { std::cout << "B" << std::endl; }
};
B b;
int main()
{
        return 0;
}
файл ccc.cpp:
Код
#include <iostream>
struct C
{
        C() { std::cout << "C" << std::endl; }
};
C c;
А теперь скомпилируй их командой: g++ aaa.cpp bbb.cpp ccc.cpp и запусти, увидишь вывод:
Код
C
B
A
А если g++ ccc.cpp bbb.cpp aaa.cpp:
Код
A
B
C


PM   Вверх
Earnest
Дата 4.12.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Речь ведь идет не о вложенных напрямую объектах, а о том что переменная A в деструкторе за каким-то лешим лезет к переменной B, тоже статической. Т.к. порядок создания их не определен, точно так же не определен и порядок разрушения. То, что он обратный созданию, не спасает - при создании объекту A до объекта B может быть до лампочки.
Это был ответ bsa... про порядок вызова деструкторов ...

Это сообщение отредактировал(а) Earnest - 4.12.2007, 16:47


--------------------
...
PM   Вверх
Random13
Дата 4.12.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Это понятно. Не понятно как указатель на внутреннюю статическую переменную, ну или пусть на глобальную статическую поможет проблему очередности решить ?
PM MAIL   Вверх
Earnest
Дата 4.12.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



По стандарту, статическая переменная внутри функции инициализируется при первом вызове этой функции. Т.е. если ты вызовешь эту функцию из конструктора другой глобальной переменной, то гарантированно наша статическая переменная будет уже готова к использованию.


--------------------
...
PM   Вверх
bsa
Дата 4.12.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Random13 @ 4.12.2007,  16:45)
Это понятно. Не понятно как указатель на внутреннюю статическую переменную, ну или пусть на глобальную статическую поможет проблему очередности решить ?

При вызове указанного метода/функции статическая переменная содержащаяся в нем уже инициализирована.
PM   Вверх
Earnest
Дата 4.12.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Более того, если функция не вызывается ни разу, переменная не будет инициализирована вообще. Что в некоторых случаях полезно.


--------------------
...
PM   Вверх
Lazin
Дата 4.12.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Random13 @  4.12.2007,  16:45 Найти цитируемый пост)
Это понятно. Не понятно как указатель на внутреннюю статическую переменную, ну или пусть на глобальную статическую поможет проблему очередности решить ? 

никак
он помогает решить проблему создания объекта по требованию...
вообще, городить систему взаимодействующих между собой глобальных объектов - это плохое проектирование.
PM MAIL Skype GTalk   Вверх
Random13
Дата 4.12.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 4.12.2007,  16:49)
По стандарту, статическая переменная внутри функции инициализируется при первом вызове этой функции. Т.е. если ты вызовешь эту функцию из конструктора другой глобальной переменной, то гарантированно наша статическая переменная будет уже готова к использованию.

А нельзя в этой самой функции инициализировать А, а следом за ним В ?
Пусть не инициализировать, но присвоить им нужные значения ?
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Random13 @  4.12.2007,  16:45 Найти цитируемый пост)
Это понятно. Не понятно как указатель на внутреннюю статическую переменную, ну или пусть на глобальную статическую поможет проблему очередности решить ?

если бы тебе была понятна суть проблемы очередности создания, то было бы понятно как данный вариант эту проблему решает
Код

// first.h

extern int x; // глобальная 

int getX();

// first.cpp

int x = 0;

int getX()
{
     static int X = 0;
    
     return X;
}

//second.cpp
#include "first.h"

int y = x; // нет гарантии, что при инициализации y переменная x уже создана

int z = getX(); // при вызове переменная будет создана и гарантия есть

PM MAIL   Вверх
Random13
Дата 4.12.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @ 4.12.2007,  16:54)
Цитата(Random13 @  4.12.2007,  16:45 Найти цитируемый пост)
Это понятно. Не понятно как указатель на внутреннюю статическую переменную, ну или пусть на глобальную статическую поможет проблему очередности решить ?

если бы тебе была понятна суть проблемы очередности создания, то было бы понятно как данный вариант эту проблему решает
Код

// first.h

extern int x; // глобальная 

int getX();

// first.cpp

int x = 0;

int getX()
{
     static int X = 0;
    
     return X;
}

//second.cpp
#include "first.h"

int y = x; // нет гарантии, что при инициализации y переменная x уже создана

int z = getX(); // при вызове переменная будет создана и гарантия есть

А если написать

int getX()
{
   
     return х;
}

у = getX();



Это не принудит построить х до у?

Добавлено через 1 минуту и 32 секунды
Нет, наверное вы правы не принудит по идее. Спасибо.
Хороший тут форум живой - где вы раньше были  smile

Добавлено через 6 минут и 31 секунду
Хотя в данном примере не передается указатель на статическую переменную - передается временная копия статической переменной  smile 
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Random13 @  4.12.2007,  16:59 Найти цитируемый пост)
Хотя в данном примере не передается указатель на статическую переменную - передается временная копия статической переменной

какая разница? Поменяй на ссылку или указатель... Принципиально в подходе ничего не изменится. 

PM MAIL   Вверх
baldina
Дата 5.12.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Ключевое слово static имеет различную семантику.
Для глобальных переменных означает ограничение области видимости единицей компиляции (т.е. cpp файлом). Считается устаревающим, рекомендуется для этого использовать неименованный namespace.

Для переменных - членов класса означает, что переменная не дублируется в каждом объекте, а существует в единственном экземпляре.

Собственно, все. По поводу правильности, законности и переносимости все уже ранее разъяснили.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.