Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Вызов статической переменной из другой функции

#c #функции #переменные


Необходимо обратиться к статической переменной из другой функции. Пример в коде:

 void First(void)
 {
    static int a = 5;
 }

 void Second(void)
 {
    //Тут необходимо узнать значение переменной 'a' из функции 'Firts'
 }

    


Ответы

Ответ 1



Напрямую - никак. Область видимости статической переменной внутри функции ограничена самой этой функцией. Можно извернуться как-то так: int *First( void ) { static int a = 0; return &a; } void Second( void ) { my *First_A_Pointer = First(); } Но сама потребность в подобных извращениях говорит о том, что архитектура кода крайне непродумана, и её нужно менять. Без вариантов.

Ответ 2



Пример не такой уж надуманный. Вот такой серьезный :) источник - W. E. Brown, “Three -related proposals, v2,” Tech. Rep. N3742, ISO/IEC JTC 1, Information Technology, Subcommittee SC 22, Programming Language C++, August 2013. Автор предлагает для начинающих упрощенный набор функций для работы со случайными числами. Поскольку движок надо иметь один (понятно, почему? :)), а глобальные переменные - очень плохо, его решение именно такое - статическая переменная, к которой имеют доступ несколько других функций (упрощенный код взят из книги "Discovering Miodern C++"): #include std::default_random_engine& global_urng() { static std::default_random_engine u{}; return u; } void randomize() { static std::random_device rd{}; global_urng().seed(rd()); } int pick(int from, int thru) { static std::uniform_int_distribution<> d{}; using parm_t = decltype(d)::param_type; return d(global_urng(),parm_t{from,thru}); } double pick(double from, double upto) { static std::uniform_real_distribution<> d{}; using parm_t = decltype(d)::param_type; return d(global_urng(),parm_t{from,upto}); } Так что, как видите, не всегда это "крайняя непродуманность"...

Комментариев нет:

Отправить комментарий