Является ли (ИСТИНА) хорошей идеей в 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 ]

2 голосов
/ 13 февраля 2009

Просто определите свои переменные в начале блока или используйте другую функцию. Добавление искусственной области видимости с пустыми {} или любой из альтернатив не является хорошей практикой.

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

Не думаю, что вам нужна часть if (true).

Только {} требуются для области видимости переменных.

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

Мой ответ следующий:

Это заставляет опытных программистов съеживаться при самой мысли об этом.

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

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

if( 1 ) // just to establish scope
{
   // do stuff here
}
1 голос
/ 12 февраля 2009

Предполагая, что вы используете старый компилятор (как я, это для старого оборудования), что вы пропускаете if (TRUE), как предлагали другие, и что у вас действительно ОГРОМНАЯ функция (ведь вам не следует использовать в первое место), тогда я думаю, что все в порядке. Я сделал это, но это не очень хорошо ...

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

Я думаю, что вы работаете с некоторыми устаревшими предположениями. Я уже несколько месяцев кодирую на простом C, используя GCC, и вам не нужно объявлять переменные в начале блока, даже если второе издание K & R говорит, что вы должны это сделать. Вы можете объявить вашу переменную в любом месте, например, как этот не очень полезный пример:

char* palstring;
palstring = malloc(LARGEST_STRING);
memset(palstring, 0, sizeof palstring);
fgets(palstring, LARGEST_STRING, fin);

char* cur = palstring;
char letter;
letter = *cur;

Так что нет необходимости делать то, что вы предлагаете. Язык перешел на.

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

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

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

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

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