У меня есть вопрос о некоторых понятиях и коде - PullRequest
0 голосов
/ 21 июня 2019

Мы знаем, что для статической переменной следующий код неверен.

//this fails: can't call gsl_vector_alloc() before main() starts

static gsl_vector *scratch = gsl_vector_alloc(20);

Мы можем решить эту проблему с помощью макроса.

В книге сказано, что мы должны [начать с нуля и распределять при первом использовании]

#define Staticdef(type, var, initialization) \ 
    static type var = 0; \
    if (!(var)) var = (initialization);

// использование:

Staticdef(gsl_vector*, scratch, gsl_vector_alloc(20));

Я не понимаю:

  1. почему мы должны начинать с нуля.
  2. что это значит под распределением при первом использовании.
  3. почему я не могу просто написать:

    #define Staticdef(type, var, initialization) \
        static type var = (initialization);
    
  4. «Это работает до тех пор, пока мы не ожидаем, что инициализация будет нулевой (или с помощью указателя, NULL). Если это так, она будет повторно инициализирована на следующем цикле». Я не понимаю, почему он будет повторно инициализирован. [Я знаю, что статические переменные могут быть инициализированы один раз и будут помнить их значение, даже если фрейм умрет, что будет использоваться для подсчета того, сколько раз вызывается функция]

Я новый программист на C, так что будьте добры со мной, если мой вопрос кажется очевидным. Заранее спасибо!

Хорошо, теперь я полностью понимаю пункт 1 и пункт 3 выше, что касается пункта 2, я думаю, что [allocate on first use] как-то связан с этой функцией gsl_vector_alloc (), но я все еще не уверен насчет пункта 4.

1 Ответ

1 голос
/ 21 июня 2019

Статические локальные переменные инициализируются только единицами и сохраняют свое значение между вызовами.

Но идея этого кода крайне плоха.Это может быть рассмотрено только для типов указателей.

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

Вообще говоря, использование этой макрокоманды в этом коде для ИМО бессмысленно и только затрудняет чтение кода и делает его более подверженным ошибкам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...