Нет, это не очень хорошая практика, если я правильно понял ваш контекст.
Если ваш код на самом деле зависит от mgt_dev_name
, имеющего начальное значение нулевого указателя, то, конечно, включение инициализатора в объявление - очень хорошая идея. То есть если тебе все равно придется это сделать
char *mgt_dev_name;
/* ... and soon after */
mgt_dev_name = NULL;
тогда всегда лучше использовать инициализацию вместо присваивания
char *mgt_dev_name = NULL;
Однако инициализация хороша только тогда, когда вы можете инициализировать свой объект с значимым полезным значением. Значение, которое вам действительно нужно. В общем случае это возможно только в тех языках, которые допускают объявления в любой точке кода, C99 и C ++ являются хорошими примерами таких языков. К тому моменту, когда вам понадобится ваш объект, вы обычно уже знаете соответствующий инициализатор для этого объекта и поэтому легко можете придумать элегантное объявление с хорошим инициализатором.
В C89 / 90, с другой стороны, объявления могут быть размещены только в начале блока. В этом случае, в общем случае, у вас не будет значимых инициализаторов для всех ваших объектов. Если вы просто инициализируете их чем-нибудь, чем-нибудь (например, 0
или NULL
), просто чтобы они инициализировали ? Нет !!! Никогда не делайте бессмысленных вещей в вашем коде. Это ничего не улучшит, независимо от того, что могут вам сказать различные «руководства по стилю». В действительности, бессмысленная инициализация может фактически покрывать ошибки в вашем коде, затрудняя их обнаружение и исправление.
Обратите внимание, что даже в C89 / 90 всегда выгодно стремиться к лучшей локализации объявлений. То есть Хорошо известное руководство по хорошей практике гласит: всегда делайте ваши переменные настолько локальными, насколько это возможно. Не складывайте все объявления локальных объектов в самом начале функции, а скорее перемещайте их в начало наименьшего блока, который максимально плотно охватывает все время жизни объекта. Иногда даже может быть хорошей идеей ввести фиктивный, в противном случае ненужный блок просто для улучшения локальности объявлений. Следование этой практике поможет вам обеспечить хорошие полезные инициализаторы для ваших объектов во многих (если не в большинстве) случаях. Но некоторые объекты останутся неинициализированными в C89 / 90 только потому, что у вас не будет хорошего инициализатора для них в момент объявления. Не пытайтесь инициализировать их чем-то просто ради инициализации. Это не принесет ничего хорошего и может иметь негативные последствия.
Обратите внимание, что некоторые современные инструменты разработки (например, MS Visual Studio 2005) будут отлавливать во время выполнения доступ к неинициализированным переменным в отладочной версии кода. Т.е. эти инструменты могут помочь вам обнаружить ситуации, когда вы обращаетесь к переменной до того, как у нее появилась возможность получить значимое значение, что указывает на ошибку в коде. Но, выполняя безусловную преждевременную инициализацию ваших переменных, вы, по сути, уничтожаете эту возможность инструмента и сметаете эти ошибки под ковер.