Мы знаем, что для статической переменной следующий код неверен.
//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));
Я не понимаю:
- почему мы должны начинать с нуля.
- что это значит под распределением при первом использовании.
почему я не могу просто написать:
#define Staticdef(type, var, initialization) \
static type var = (initialization);
«Это работает до тех пор, пока мы не ожидаем, что инициализация будет нулевой (или с помощью указателя, NULL). Если это так, она будет повторно инициализирована на следующем цикле». Я не понимаю, почему он будет повторно инициализирован. [Я знаю, что статические переменные могут быть инициализированы один раз и будут помнить их значение, даже если фрейм умрет, что будет использоваться для подсчета того, сколько раз вызывается функция]
Я новый программист на C, так что будьте добры со мной, если мой вопрос кажется очевидным.
Заранее спасибо!
Хорошо, теперь я полностью понимаю пункт 1 и пункт 3 выше, что касается пункта 2, я думаю, что [allocate on first use] как-то связан с этой функцией gsl_vector_alloc (), но я все еще не уверен насчет пункта 4.