LINUX.ORG.RU

Linux и макрос define


0

0

В статье про define и include вспомнил о втором применении define, как макроса. Только не могу понять, неужели риск использовать макросы define, в место простеньких функций не стоит того, что бы уменьшить размер кода и улучшить наглядность?


Дата регистрации: 10.01.2010 19:27:38

Первая созданная тема: 10.01.2010 19:35:02
Последняя созданная тема: 10.01.2010 19:35:02

ip1981 ☆☆
()

Ви про что?

#define MAX(x,y) x>y?:x:y
int MAX(int x, int y){
return x>y?:x:y;
}

Где разница то? Да и что там макросы, если писать больше одной строки, то это пипец. Не красиво.

#define SET_LINKS(p) do { \
(p)->next_task = &init_task; \
(p)->prev_task = init_task.prev_task; \
init_task.prev_task->next_task = (p); \
init_task.prev_task = (p); \
(p)->p_ysptr = NULL; \
if (((p)->p_osptr = (p)->p_pptr->p_cptr) != NULL) \
(p)->p_osptr->p_ysptr = p; \
(p)->p_pptr->p_cptr = p; \
} while (0)
tia
()

И да, тема - чистый троллинг. Если заменить многие(даже если только мелкие) функции на макросы, то чтение пост-препроцессорного кода станет не реальным.

tia
()

>Директивы препроцессора в языке си

Выбрось каку. Судя по вопросу тебе нужен CL.

anonymous
()
Ответ на: комментарий от anonymous

Если автор - тролль, то пусть идет лесом. Если нет, то...

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

За примерами далеко ходить не надо, можно в коде ядра посмотреть какой-нибудь include/linux/list.h. Макрос list_for_each_entry, напрример.

ratatosk
()
Ответ на: комментарий от tia

> Где разница то?
Разница, очевидно в инте.
MAX(1,0.5) Ы?

den73 ★★★★★
()
Ответ на: комментарий от tia

И что в этом некрасивого? Выравнивание черточек приличные редакторы делают автоматически.

#define SET_LINKS(p)                                  \
do {                                                  \ 
    (p)->next_task = &init_task;                      \ 
    (p)->prev_task = init_task.prev_task;             \ 
    init_task.prev_task->next_task = (p);             \ 
    init_task.prev_task = (p);                        \ 
    (p)->p_ysptr = NULL;                              \ 
    if (((p)->p_osptr = (p)->p_pptr->p_cptr) != NULL) \ 
        (p)->p_osptr->p_ysptr = p;                    \ 
    (p)->p_pptr->p_cptr = p;                          \ 
} while (0) 
anonymous
()
Ответ на: комментарий от lester

> > и да, у тебя неправильно:

#define MAX( x, y ) (((x) > (y)) ? (x) : (y))

Fixed (c)

Да, у тебя неправильно. Вот, лучше так (ахтунг, гну!):

#define MAX(x,y) ({ typeof(x) X_ = (x); typeof(y) Y_ = (y); X_>Y_?X_:Y_; })

«Гигиена», правда, ложится на name convention.

Finally fixed. ©

suzuki
()
Ответ на: комментарий от alg0rythm

Случайно нажал ':' -_-
Дык я намекал что автор хочет заставить всех юзать другой способ даже не понимая разницы между ними.

tia
()
Ответ на: комментарий от lester

> > Вот, лучше так (ахтунг, гну!):

по рукам надо бить за привязку к фичам компиляторов :)

Документированный баг багом не является — это фича! ©

suzuki
()
Ответ на: комментарий от lester

Да, да. Я специально не добавлял «защиту от дебила» чтобы рассматривать данные примеры как примеры применения, но не более.

tia
()
Ответ на: комментарий от anonymous

Тонко. А давайте вы теперь откажитесь от функций и будите писать одними макросами? Вот забавно будет...

tia
()
Ответ на: комментарий от tia

> А давайте вы теперь откажитесь от функций и будите писать одними макросами? Вот забавно будет...

многострочные макросы таки тоже бывают нужны - например для ООП в С/С++

lester ★★★★
()
Ответ на: комментарий от tia

Зачем приписывать мне чужие идеи. Я только прокомментировал это:

Да и что там макросы, если писать больше одной строки, то это пипец. Не красиво.

anonymous
()
Ответ на: тонко от suzuki

>Это ты про имакс, да?
На имаксе свет клином не сошелся. Любой более-менее развитый редактор. Поделки, не дотягивающие даже до ed, не в счет.

anonymous
()
Ответ на: комментарий от suzuki

>Поделки, не дотягивающие даже до ed, не в счет.

vim «из коробки» такое не может IIRC


Ох, как ты сейчас обос*ал вим :)

alg0rythm
()

а причём тут Линукс?

yoghurt ★★★★★
()
Ответ на: комментарий от tia

>Где разница то?

Разница в том, что первый вариант будет работать быстрее. И, да, написан он неправильно

yoghurt ★★★★★
()
Ответ на: комментарий от lester

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

tia
()
Ответ на: комментарий от yoghurt

> Часто вы читаете пост-процессорный код?)

несколько раз приходилось - удовольствие не из приятных :)

lester ★★★★
()
Ответ на: комментарий от tia

> Если заменить многие(даже если только мелкие) функции на макросы, то чтение пост-препроцессорного кода станет не реальным.

Решается indent'ом + небольшими скриптами

suzuki
()
Ответ на: комментарий от lester

Мне тоже иногда приходится. Но всё зависит от самого кода. Так получается что у меня он не такой уж и «неприятный».

tia
()

> mir-koda.ru

Фу, ну и шлак. Автор, читай лучше K&R, не разжижжай моск

yoghurt ★★★★★
()
Ответ на: комментарий от lester

> тем более, что такую оптимизацию компиляторы сами произведут

Это не оптимизация, а защита от вычисления аргументов более 1 одного раза.

suzuki
()
Ответ на: комментарий от suzuki

> Это не оптимизация, а защита от вычисления аргументов более 1 одного раза.

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

lester ★★★★
()
Ответ на: комментарий от lester

Тогда бить по голове. Стенкой. И да, на одном предприятии главный кодер, увидив такой код у одного работника, сразу подал на увольнение этого бедняги. Хотя он был вебкодером и на CPP не очень давно перешёл, по его словам.
В общем, да. Печально.

tia
()
Ответ на: комментарий от lester

> > Это не оптимизация, а защита от вычисления аргументов более 1 одного раза.

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

О да, я то же за запрет писать плохой, негодный код. Не скажешь, как этого можно добиться и контролировать автоматом? Удвоить отдел QA и заставить их верифицировать код? Или ты знаешь, как можно легко контролировать/определять чистоту функций в Си? :D

suzuki
()
Ответ на: комментарий от suzuki

Фильтрация на уровне QA. Вообще - испытательный срок, в начале которого проверяется весь код.
Набыдлокодил - пака пака.

tia
()
Ответ на: комментарий от suzuki

>Это не оптимизация, а защита от вычисления аргументов более 1 одного раза.

Это не обувь, это ботинки!

yoghurt ★★★★★
()
Ответ на: комментарий от suzuki

> ({ typeof(x) X_ = (x); typeof(y) Y_ = (y); X_>Y_?X_:Y_; })

О да, я то же за запрет писать плохой, негодный код.


код не по стандартам и прибитый к gcc таковым не считается? :) другие компиляторы обматерят даже запись «int z = ({1;});», не говоря уж про typeof

lester ★★★★
()
Ответ на: комментарий от yoghurt

> >Это не оптимизация, а защита от вычисления аргументов более 1 одного раза.

Это не обувь, это ботинки!

Неверно.

[code=c] while( max(i,j++) < strlen(something) ) { handle(something[i]); process(something[j]); update_idx(&i, j, something); ... } [/code]

Если max - это макрос, вычисляющий аргументы более 1 одного раза, то всё будет работать некорректно. Если функция/шаблон - то всё будет чётко.

suzuki
()
Ответ на: комментарий от lester

> > ({ typeof(x) X_ = (x); typeof(y) Y_ = (y); X_>Y_?X_:Y_; })

> О да, я то же за запрет писать плохой, негодный код.

код не по стандартам и прибитый к gcc таковым не считается? :) другие компиляторы обматерят даже запись «int z = ({1;});», не говоря уж про typeof

Слушай, ты в самом деле такой альтернативно одарённый? Я сразу написал, что код требует гну-шных расширений. Постарайся впредь читать мои посты полностью.

Код по стандартам гцц. Это написанно. Всё. Проблем нет. Хочешь примеров такого кода - пожалуйстя, пройди на kernel.org

suzuki
()
Ответ на: комментарий от suzuki

> while( max(i,j++)

во-первых MAX, а во-вторых:

MAX( i, j ) < strlen( something ), ++j

lester ★★★★
()
Ответ на: комментарий от lester

> код не по стандартам и прибитый к gcc таковым не считается?

Сколько ты знаешь компиляторов, поддерживающих c99?

suzuki
()
Ответ на: комментарий от suzuki

> Я сразу написал, что код требует гну-шных расширений

ну вот опять - я тебя сейчас спрошу, где ты написал, что «код требует» таковые расширения и без них никак, ты начнешь петросянить, скучно

lester ★★★★
()
Ответ на: комментарий от suzuki

> Сколько ты знаешь компиляторов, поддерживающих c99?

я знаю много программ и библиотек, которые прекрасно собираются разными компиляторами на разных платформах

lester ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.