URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6313
[ Назад ]

Исходное сообщение
"Проверка с помощью If"

Отправлено new_for_coding , 29-Мрт-07 15:53 
Доброго всем дня!

Есть вот такая конструкция:

abl_args *args;
if (args = malloc(sizeof(abl_args)), NULL == args) {..}

Я правильно понимаю, что в ней выделяется память для структуры abl_args и проверяется выделена ли она? Первую часть условия для читабельности можно было вынести отдельно? Прокомментируйте пожалуйста с точки зрения правильности и красивости.


Заранее большое спасибо.


Содержание

Сообщения в этом обсуждении
"Проверка с помощью If"
Отправлено rmf , 29-Мрт-07 16:27 
>Доброго всем дня!
>
>Есть вот такая конструкция:
>
>abl_args *args;
>if (args = malloc(sizeof(abl_args)), NULL == args) {..}


может я отстал дико,
но это пипец какой-то


if ( NULL == ( args = malloc(sizeof(abl_args)) )){ нету больше памяти }


"Проверка с помощью If"
Отправлено Michelnok , 29-Мрт-07 16:27 
>
>Я правильно понимаю, что в ней выделяется память для структуры abl_args и
>проверяется выделена ли она?

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

>Первую часть условия для читабельности можно было вынести отдельно?

Для читабельности - обязательно.

>Прокомментируйте пожалуйста с точки зрения правильности и красивости.

Правильно. Но непонятно на первый взгляд.
Красиво будет так:

abl_args *args;

args = malloc(sizeof(abl_args));
if (args == NULL) {
    ..
}

Можно, конечно, написать и if (NULL == args), но это уже вопрос религии. Лично я считаю что так как мы проверяем значение переменной, а не константы, то переменная в if должна идти первой, для читабельности.


"Проверка с помощью If"
Отправлено new_for_coding , 29-Мрт-07 16:57 
Большое спасибо.

"Проверка с помощью If"
Отправлено rmf , 30-Мрт-07 12:18 
>Красиво будет так:
>
>abl_args *args;
>
>args = malloc(sizeof(abl_args));
>if (args == NULL) {
>    ..
>}
>
>Можно, конечно, написать и if (NULL == args), но это уже вопрос
>религии. Лично я считаю что так как мы проверяем значение переменной,
>а не константы, то переменная в if должна идти первой, для
>читабельности.

Точно, именно такой способ более надежный,
так как в выражении
if (NULL == (args = malloc(..)) )
более вероятно очепятаться и написать
if (NULL = (args = malloc(..)) )

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

так что компилируйте всегда с -Wall



"Проверка с помощью If"
Отправлено vic , 30-Мрт-07 12:49 
То же впервые вижу столь оригинальный подход.

>Красиво будет так:
>
>abl_args *args;
>
//если в этом месте появится какой-то код и что хуже код юзающий args, то могут быть неприятности.
>
>args = malloc(sizeof(abl_args));
>if (args == NULL) {
>    ..
>}
>
в общем +1
но добавлю 5 коп., на K&R уже почти давно никто не пишет, поэтому:
abl_args *args = malloc(sizeof(abl_args));  // объявлять и сразу инициализировать
if (!args) // третий вариант для code style war :)
{
   // ..
}


"Проверка с помощью If"
Отправлено new_for_coding , 30-Мрт-07 14:03 

>но добавлю 5 коп., на K&R уже почти давно никто не пишет,
Проcтите, а что такое K&R?

"Проверка с помощью If"
Отправлено phpcoder , 30-Мрт-07 14:08 
>>но добавлю 5 коп., на K&R уже почти давно никто не пишет,
>Проcтите, а что такое K&R?

K&R == Kernigan & Ritchie, авторы известной книжки "Язык Си". В данном случае имеется ввиду стиль оформления кода, который они использовали в своей книге и который именуется в их честь.


"Проверка с помощью If"
Отправлено new_for_coding , 30-Мрт-07 14:22 
>K&R == Kernigan & Ritchie, авторы известной книжки "Язык Си". В данном
>случае имеется ввиду стиль оформления кода, который они использовали в своей
>книге и который именуется в их честь.
А можете порекомендовать какие-то книги, в которых описана именно современная стилистика? Или все обычно доходят до этого сами после многочисленных воин на форумах? :)

"Проверка с помощью If"
Отправлено phpcoder , 30-Мрт-07 14:25 
>А можете порекомендовать какие-то книги, в которых описана именно современная стилистика? Или
>все обычно доходят до этого сами после многочисленных воин на форумах?
>:)

Каждый выбирает и решает сам как ему оформлять.


"Проверка с помощью If"
Отправлено Michelnok , 30-Мрт-07 15:49 
>А можете порекомендовать какие-то книги, в которых описана именно современная стилистика?

Если имеется в виду современное состояние языка C, то лучше самого стандарта C99 и не придумать. Посмотрите на http://www.open-std.org/JTC1/SC22/WG14/www/standards

Если имеется в виду только оформление кода, то крупные проекты (такие как Linux и FreeBSD) имеют свои правила. Выяснение "какие правила лучше?" глупы по определению, так как правила разрабатывались исключительно с целью иметь код одинакового стиля по всему проекту, чтобы привыкшие к этому стилю разработчики могли легко читать код друг друга. Т.е. цель - не сделать лучше ("лучше" и "хуже" - это понятия субьективные), цель - сделать единообразно.
О Linux kernel coding style можно почитать, например, тут - http://www.linuxjournal.com/article/5780
По-русски и в бумажном виде - в книге http://www.williamspublishing.com/Books/5-8459-1085-4.html
О FreeBSD coding style - в статье style(9) - http://www.freebsd.org/cgi/man.cgi?query=style&sektion=9


"Проверка с помощью If"
Отправлено vic , 30-Мрт-07 14:25 
>>>но добавлю 5 коп., на K&R уже почти давно никто не пишет,
>>Проcтите, а что такое K&R?
>
>K&R == Kernigan & Ritchie, авторы известной книжки "Язык Си". В данном
>случае имеется ввиду стиль оформления кода, который они использовали в своей
>книге и который именуется в их честь.

Они _авторы_ языка С :) Ну и конечно авторы и книжки и стиля.

Уточню, что имел ввиду что раньше в С было принято (и компилятор иначе не позволял) размещать объявления переменных в начале функции до первого оператора, позже ограничение было снято и переменные объявлять можно в любом месте.


"Проверка с помощью If"
Отправлено Michelnok , 30-Мрт-07 15:30 
>
> В данном случае имеется ввиду стиль оформления кода, ...

Скорее имеется в виду возможность определения переменных по всему коду, а не только в начале блоков.