Подтвердить что ты не робот

Является ли (TRUE) хорошей идеей в C?

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

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

     if(TRUE)
     {
         char a;
         int b;

         ... Do some more stuff ...
     }

     ... Do even more stuff ...
 }

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

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

EDIT: В ответ на некоторые из ответов код, с которым я работаю, должен работать с некоторыми довольно древними устаревшими системами. Хотя было бы неплохо работать на предположении C99, мы действительно не можем гарантировать, что они будут иметь его.

4b9b3361

Ответ 1

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

Возможно, это должна быть отдельная функция.

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

#include <stdio.h>

int
main(int argc, char **argv) {
    int i = 0;
    {
        int i = 10;
        printf("%d\n", i);
    }
    printf("%d\n", i);
}

Ответ 2

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

Используйте только фигурные скобки:

{
    int x;

}

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

if (TRUE)

поскольку это затрудняет читаемость.

Ответ 3

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

Ответ 4

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

void foo() {
     ... Do some stuff ...
     {
         char a;
         int b;
         ... Do some more stuff ...
     }
     ... Do even more stuff ...
}

Ответ 5

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

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

Ответ 6

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

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

 {
     char a;
     int b;

     ... Do some more stuff ...
 }

 ... Do even more stuff ...
}

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

Ответ 7

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

if(TRUE)

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

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

Ответ 8

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

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

Ответ 9

Я бы не назвал себя приправленным, но я вроде как хрюкаю.

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

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

Ответ 10

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

#define TRUE 0
#define FALSE 1

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

Ответ 11

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

Для изменения переменных требуется только {}.

Ответ 12

Мой ответ таков:

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

Ответ 13

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

Ответ 14

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

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

Ответ 15

Я думаю, вы работаете с некоторыми устаревшими предположениями. Я кодировал прямо 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-языку является Variable Length Arrays, который позволяет передавать массив функции вместе с ее размером. В старые времена все, что вы могли сделать, это передать указатель.

Ответ 16

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

Ответ 17

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

if( 1 ) // just to establish scope
{
   // do stuff here
}