Является ли (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, мы действительно не можем гарантировать, что они будут иметь его.
Ответы
Ответ 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
}