C99 смешанные объявления и код в проектах с открытым исходным кодом? - PullRequest
6 голосов
/ 12 июня 2010

Почему все еще C99 смешанные объявления и код не используются в проектах с открытым исходным кодом C, таких как ядро ​​Linux или GNOME ?

Мне действительно нравятся смешанные объявления и код, так как он делает код более читабельным и предотвращает трудно видимые ошибки, ограничивая область видимости переменных до максимально узкой. Это рекомендуется Google для C ++ .

Например, Linux требует как минимум GCC 3.2 и GCC 3.1 имеет поддержку для смешанных объявлений C99 и кода

Ответы [ 7 ]

3 голосов
/ 12 июня 2010

Вы не нуждаетесь в смешанном объявлении и коде, чтобы ограничить область действия.Вы можете сделать:

{
  int c;
  c = 1;
  {
    int d = c + 1;
  }
}

в C89.Что касается того, почему в этих проектах не использовались смешанные объявления (при условии, что это правда), это, скорее всего, случай «Если ничего не сломано, не исправляйте».

3 голосов
/ 16 июня 2010

Это старый вопрос, но я собираюсь предположить, что инерция является причиной того, что в большинстве этих проектов все еще используются правила декларации ANSI C.

Однако существует ряд других возможностей, начиная отдо смешного:

  • Переносимость.Многие проекты с открытым исходным кодом работают в предположении, что педантичный ANSI C является наиболее переносимым способом написания программного обеспечения.

  • Возраст.Многие из этих проектов предшествуют спецификации C99, и авторы могут предпочесть единый стиль кодирования.

  • Невежество.Программисты отправляют до C99 и не знают о преимуществах смешанных объявлений и кода.(Альтернативная интерпретация: разработчики в полной мере осознают возможные компромиссы и решают, что смешанные объявления и операторы не стоят усилий. Я крайне не согласен, но редко когда два программиста соглашаются на что-либо.)

    FUD.Программисты рассматривают смешанные объявления и код как «C ++ ism» и поэтому не любят его.

1 голос
/ 12 июня 2010

Я не помню никаких запретов на это в руководстве по стилю для кода ядра.Тем не менее, он говорит, что функции должны быть как можно меньше, и делать только одну вещь.Это объясняет, почему сочетание объявлений и кода встречается редко.

В небольшой функции объявление переменных в начале области действия действует как своего рода 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 определяется дважды.«Так? Уберите второе объявление».ты говоришь.Но это делает код асимметричным, и в результате вы получаете больше ограничений по рефакторингу.

Конечно, я сам смешиваю объявления и код;нет причин быть догматичными по этому поводу (иначе ваша карма может навязаться вашей догме :-).Но вы должны знать, каковы сопутствующие проблемы.

1 голос
/ 12 июня 2010

Нет особых оснований переписывать ядро ​​Linux для внесения косметических изменений, которые не приводят к увеличению производительности.

Если база кода работает, так зачем менять ее по косметическим причинам?

0 голосов
/ 12 июня 2010

Там нет никакой выгоды. Объявление всех переменных в начале функции (как в Паскале) намного более понятно, в C89 вы также можете объявлять переменные в начале каждой области (пример внутри циклов), что практично и кратко.

0 голосов
/ 12 июня 2010

Нет причин изменять код таким образом, и C99 все еще не поддерживается широко компиляторами. В основном это переносимость.

0 голосов
/ 12 июня 2010

Может быть, это не нужно, может быть, разделение хорошо?Я делаю это в C ++, который также имеет эту функцию.

...