Просто имея разговор с коллегой на работе, как объявить переменные. Для меня я уже решил, какой стиль я предпочитаю, но возможно я неправильно.
"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.
Я предпочитаю "стиль C++". В основном потому, что он позволяет RAII, что вы и делаете в обоих своих примерах для переменной bool.
Кроме того, наличие узкой области видимости для переменной дает компилятору лучшие возможности для оптимизации.
Если из-за языка, который вы используете, вы должны объявить переменные в верхней части функции, то, очевидно, вы должны это сделать.
Если у вас есть выбор, то имеет смысл объявить переменные там, где они используются. Эмпирическое правило, которое я использую: объявляйте переменные с наименьшей требуемой областью.
Уменьшение области действия переменной предотвращает некоторые ошибки типов, например, когда вы случайно используете переменную вне цикла, которая предназначалась только для использования внутри цикла. Уменьшение области действия переменной позволит компилятору обнаружить ошибку вместо кода, который компилируется, но завершается сбоем во время выполнения.
Это не проблема стиля. В C ++ конструкторы, не относящиеся к POD-типам, будут вызывать их конструкторы в точке объявления, а деструкторы - в конце области видимости. Вы должны быть мудры в выборе места для объявления переменных, иначе вы вызовете ненужные проблемы с производительностью. Например, объявление переменной класса внутри цикла может быть не самой разумной идеей, поскольку конструктор / деструктор будет вызываться на каждой итерации цикла. Но иногда объявление переменных класса в верхней части функции может быть не лучшим вариантом, если есть шанс, что переменная вообще не будет использоваться (например, переменная используется только внутри некоторого оператора if).
Я предпочитаю стиль C, потому что стиль C++ имеет один серьезный недостаток: в плотной функции очень трудно найти объявление/инициализацию переменной. (Ни одна подсветка синтаксиса еще не смогла надежно и предсказуемо справиться с моими привычками кодирования опасностей на C++.)
Хотя я не придерживаюсь строго никакого стиля: туда помещаются только ключевые переменные, и большинство мелких второстепенных переменных живут в блоке, где они необходимы (например, bool rc
в вашем примере).
Но все важные ключевые переменные в моем коде неизбежно объявляются сверху. И если во вложенном блоке у меня слишком много локальных переменных, это признак того, что я должен начать думать о разделении кода на более мелкие функции.
Это, вероятно, немного субъективно.
Я предпочитаю как можно более локально, потому что это полностью проясняет, какая область предназначена для переменной, и компилятор генерирует ошибку, если вы обращаетесь к ней за пределами предполагаемой полезной области.
Второй. (стиль C++) Для этого есть как минимум две веские причины: