Объявите переменную как можно локально - PullRequest
4 голосов
/ 25 августа 2011

Я новичок в разработке ядра Linux.

Меня беспокоит то, как переменные объявляются и инициализируются.

У меня сложилось впечатление, что код использует правила размещения объявления переменных для C89 / ANSI C (переменные объявляются в начале блока), а C99 ослабляет правило.

Мой опыт работы с C ++, и многие "очень умные люди" советуют объявлять переменные как можно более локально - лучше объявлять и инициализировать в одной и той же инструкции:

Каков приемлемый способ инициализации переменных в ядре Linux?

Ответы [ 6 ]

7 голосов
/ 25 августа 2011

Я не смог найти соответствующий отрывок в стиле кодирования ядра Linux .Итак, следуйте соглашению, используемому в существующем коде - объявляйте переменные в начале блока - или рискуйте, если ваш код окажется неуместным.

Причины, по которым переменные в начале блока - это хорошая вещь:

  • целевая архитектура может не иметь компилятора C99
  • ... не может придумать больше причин
2 голосов
/ 25 августа 2011

Вы всегда должны объявлять переменные настолько локально, насколько это возможно. Если вы используете C ++ или C99, это обычно происходит перед первым использованием.
В более старом C это не относится к категории «возможно», и там местом, где объявляются эти переменные, обычно является начало текущего блока.

(я говорю «обычно» из-за некоторых случаев с функциями и циклами, когда лучше сделать их немного более глобальными ...)

1 голос
/ 25 августа 2011

В документе Coding Style имеется косая ссылка.Там написано:

Еще одним показателем функции является количество локальных переменных.Они не должны превышать 5-10, или вы делаете что-то не так.Переосмыслите функцию и разбейте ее на более мелкие части.Человеческий мозг, как правило, может легко отслеживать около 7 различных вещей, что угодно, и это запутывается.Вы знаете, что вы великолепны, но, возможно, вы хотели бы понять, что вы сделали через 2 недели.

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

1 голос
/ 25 августа 2011

В большинстве обычных случаев объявляйте их в начале функции, в которой вы их используете. Есть исключения, но они редки.

Если ваша функция достаточно короткая, замедление в любом случае далеко от первого использования. Если ваша функция длиннее, то это - хороший знак, что ваша функция слишком длинная.

Причина, по которой многие стандарты кодирования на основе C ++ рекомендуют объявлять близким к использованию, заключается в том, что типы данных C ++ могут быть намного «жирнее» (например, класс с множественным наследованием и т. Д.) И поэтому занимают намного больше места. Если вы определяете такой экземпляр в начале функции, но используете его только намного позже (и, возможно, вообще не используете), вы тратите много оперативной памяти. Это, как правило, гораздо меньше проблем в C с типами данных только нативного типа.

0 голосов
/ 25 августа 2011

Я не могу сказать, почему они сделали что-то одно в ядре Linux, но в системах, которые мы разрабатываем, мы склонны не использовать специфичные для C99 функции в коде ядра.Отдельные приложения, как правило, имеют материал, написанный для C99, потому что они, как правило, развертываются на одной известной платформе, а реализация gcc C99 хорошо известна.

Но основной код должен быть развернут на любой платформе, которую требует клиент(в пределах разумного).Мы поставляли системы для AIX, Solaris, Informix, Linux, Tru-64, OpenVMS (!), И наличие компиляторов, совместимых с C99, не всегда гарантировано.

Ядро Linux должно быть значительно более портативным- и, в частности, благодаря компактным встроенным системам.Я полагаю, что эта функция не настолько важна, чтобы игнорировать подобные соображения.

0 голосов
/ 25 августа 2011

В старом C их можно объявить локально, создав блок внутри функции. Блоки могут быть добавлены даже без ifs / for / while:

int foo(void)
{
    int a;
    int b;

    ....

    a = 5 + b;

    {
         int c;
         ....
    }
}

Хотя это выглядит не очень аккуратно, но все же возможно, даже в старшей C.

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