Я не помню никаких запретов на это в руководстве по стилю для кода ядра.Тем не менее, он говорит, что функции должны быть как можно меньше, и делать только одну вещь.Это объясняет, почему сочетание объявлений и кода встречается редко.
В небольшой функции объявление переменных в начале области действия действует как своего рода Introit , сообщая вам кое-что о том, что произойдет вскоре после этого.В этом случае перемещение объявления переменной настолько ограничено, что, скорее всего, оно либо не будет иметь никакого эффекта, либо послужит сокрытию некоторой информации о функциональности, толкая, так сказать, баркера в толпу.Есть причина, по которой прибытие короля было объявлено до того, как он вошел в комнату.
OTOH, функция, которая должна смешивать переменные и код, чтобы быть читаемой, вероятно, слишком велика.Это один из признаков (наряду со слишком вложенными блоками, встроенными комментариями и другими вещами) того, что некоторые разделы функции необходимо абстрагировать в отдельные функции (и объявить static
, чтобы оптимизатор мог встроить их).
Еще одна причина сохранять объявления в начале функций: если вам нужно изменить порядок выполнения операторов в коде, вы можете переместить переменную из ее области видимости, не осознавая этого, поскольку область действия переменной, объявленной всередина кода не видна в отступе (если вы не используете блок для отображения области видимости).Это легко исправить, так что это просто раздражение, но новый код часто подвергается такому преобразованию, и раздражение может быть накопительным.
И еще одна причина: у вас может возникнуть желание объявить переменную для получения кода возврата ошибки из функции, например так:
void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }
Совершенно разумная вещь, которую нужно сделать.Но:
void_func();
int ret = func_may_fail();
if (ret) { handle_fail(ret) }
....
int ret = another_func_may_fail();
if (ret) { handle_other_fail(ret); }
Упс!ret
определяется дважды.«Так? Уберите второе объявление».ты говоришь.Но это делает код асимметричным, и в результате вы получаете больше ограничений по рефакторингу.
Конечно, я сам смешиваю объявления и код;нет причин быть догматичными по этому поводу (иначе ваша карма может навязаться вашей догме :-).Но вы должны знать, каковы сопутствующие проблемы.