Функция и объявление локальной переменной

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

"C" стиль - вся переменная в начале функции. Если Вы хотите знать тип данных переменной, просто посмотрите на начало функции.

bool Foo()
{
    PARAM* pParam = NULL;
    bool rc;

    while (true)
    {
       rc = GetParam(pParam);
       ... do something with pParam
    }
}

Стиль "C++" - объявляет переменные, максимально локальные.

bool Foo()
{       
    while (true)
    {
        PARAM* pParam = NULL;

        bool rc = GetParam(pParam);
       ... do something with pParam
    }
}

Что Вы предпочитаете?

Обновление вопрос расценивает переменные POD.

5
задан dimba 6 July 2010 в 21:35
поделиться

6 ответов

Я предпочитаю "стиль C++". В основном потому, что он позволяет RAII, что вы и делаете в обоих своих примерах для переменной bool.

Кроме того, наличие узкой области видимости для переменной дает компилятору лучшие возможности для оптимизации.

3
ответ дан 18 December 2019 в 07:53
поделиться

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

Если у вас есть выбор, то имеет смысл объявить переменные там, где они используются. Эмпирическое правило, которое я использую: объявляйте переменные с наименьшей требуемой областью.

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

4
ответ дан 18 December 2019 в 07:53
поделиться

Это не проблема стиля. В C ++ конструкторы, не относящиеся к POD-типам, будут вызывать их конструкторы в точке объявления, а деструкторы - в конце области видимости. Вы должны быть мудры в выборе места для объявления переменных, иначе вы вызовете ненужные проблемы с производительностью. Например, объявление переменной класса внутри цикла может быть не самой разумной идеей, поскольку конструктор / деструктор будет вызываться на каждой итерации цикла. Но иногда объявление переменных класса в верхней части функции может быть не лучшим вариантом, если есть шанс, что переменная вообще не будет использоваться (например, переменная используется только внутри некоторого оператора if).

0
ответ дан 18 December 2019 в 07:53
поделиться

Я предпочитаю стиль C, потому что стиль C++ имеет один серьезный недостаток: в плотной функции очень трудно найти объявление/инициализацию переменной. (Ни одна подсветка синтаксиса еще не смогла надежно и предсказуемо справиться с моими привычками кодирования опасностей на C++.)

Хотя я не придерживаюсь строго никакого стиля: туда помещаются только ключевые переменные, и большинство мелких второстепенных переменных живут в блоке, где они необходимы (например, bool rc в вашем примере).

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

-1
ответ дан 18 December 2019 в 07:53
поделиться

Это, вероятно, немного субъективно.

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

1
ответ дан 18 December 2019 в 07:53
поделиться

Второй. (стиль C++) Для этого есть как минимум две веские причины:

  1. Это позволяет применять в коде принцип YAGNI, поскольку вы объявляете переменную только тогда, когда она вам нужна, как можно ближе к моменту ее использования. Это облегчает быстрое понимание кода, поскольку вам не нужно возвращаться назад и вперед в функции, чтобы понять все это. Тип каждой переменной - это основная информация о переменной, которая не всегда очевидна в изменчивом имени. Короче говоря, код легче читать.
  2. Это позволяет лучше оптимизировать компилятор (когда это возможно). Чтение : http://www.tantalon.com/pete/cppopt/asyougo.htm#PostponeVariableDeclaration
13
ответ дан 18 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: