Является ли (ИСТИНА) хорошей идеей в C? - PullRequest
16 голосов
/ 12 февраля 2009

В языке программирования C я понимаю, что переменные могут быть определены только в начале блока кода, и переменная будет иметь область действия блока, в котором она была объявлена. Имея это в виду, мне было интересно считается ли плохой практикой искусственное создание новой области видимости, как в этом примере:

void foo()
{
     ... Do some stuff ...

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }

Если в определении макроса TRUE установлено значение 1, будет ли этот код считаться «хорошим кодом» или это заставит опытных программистов съежиться от самой мысли об этом?

Спасибо за ваш вклад!

РЕДАКТИРОВАТЬ: В ответ на некоторые ответы код, с которым я работаю, должен работать с некоторыми довольно древними устаревшими системами. Хотя было бы неплохо работать с допущением C99, мы действительно не можем гарантировать, что они его получат.

Ответы [ 17 ]

50 голосов
/ 12 февраля 2009

Вам даже не нужно выражение if. Вы можете создавать блоки с помощью {}

Однако, вероятно, это должна быть отдельная функция.

Пример здесь:

#include <stdio.h>

int
main(int argc, char **argv) {
    int i = 0;
    {
        int i = 10;
        printf("%d\n", i);
    }
    printf("%d\n", i);
}
16 голосов
/ 12 февраля 2009

Насколько я знаю, вы можете создать область без if.

Используйте только такие скобки:

{
    int x;

}

И я рекомендую против

if (TRUE)

, поскольку это ухудшает читабельность.

7 голосов
/ 12 февраля 2009

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

6 голосов
/ 12 февраля 2009

Поскольку вы можете просто сделать блок области видимости без if, это лучшая идея.

void foo() {
     ... Do some stuff ...
     {
         char a;
         int b;
         ... Do some more stuff ...
     }
     ... Do even more stuff ...
}
6 голосов
/ 12 февраля 2009

Обратите внимание, что в C99 разрешено объявлять локальные переменные в середине блоков.

C99 - версия стандарта C с 1999 года; большинство современных компиляторов Си поддерживают его.

5 голосов
/ 12 февраля 2009

Прежде всего, новый блок не должен быть блоком if. Это может быть просто фрагмент кода, заключенный в фигурные скобки, например:

void foo() {
 ... Do some stuff ...

 {
     char a;
     int b;

     ... Do some more stuff ...
 }

 ... Do even more stuff ...
}

Во-вторых, в любом современном компиляторе C, который соответствует стандарту C (я думаю, C99), вы можете объявлять переменные в любом месте блока, поэтому вам вообще не нужно создавать новый блок.

4 голосов
/ 12 февраля 2009

Вы можете удалить

if(TRUE)

и просто оставьте скобки, которые сами по себе определяют новый синтаксический блок - составное выражение .

Это определенно чище, чем ложное, если у вас было раньше, но вы все равно можете спросить себя, почему вы хотите создать новый блок - было бы лучше определить подпрограмму?

4 голосов
/ 12 февраля 2009

Как уже сказано так много ответов, вам не нужно "если". Просто создайте голый блок. Но я хочу попасть в другой момент. В C вы можете создавать объявления переменных в любом месте блока, а не только в начале. В C89 у вас было это ограничение. Начиная с C99 (это 10 лет), у вас больше нет этого ограничения, хотя некоторые компиляторы все равно будут стонать. GCC не будет, однако, если вы скажете ему использовать самый «последний» стандарт C с опцией -std = c99.

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

3 голосов
/ 12 февраля 2009

Оставив дверь открытой для некоторых творческих людей:

#define TRUE 0
#define FALSE 1

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

3 голосов
/ 12 февраля 2009

Я бы не назвал себя бывалым, но я как бы съеживаюсь.

Моя проблема с этим заключается в том, что выражение if заставит кого-то поверить, что что-то на самом деле оценивается ... но во время выполнения макрос либо true, либо false, нет никаких изменений в том, что он является чем-то другим. Вы должны либо включить код, либо нет.

Если то, что вы хотите сделать, это что-то вроде #ifdef DEBUG, то вы должны сделать это, чтобы указать читателю, что это код отладки ...

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