Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Параметр макроса С
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
Dimentius
Как правильно написать макрос со структурой, зависящей от параметра?
Например, для циклов ожидания.

Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :

#define DELAY(N)\
#if (N == 1)\
NOP;\
#elif (N > 1)\
delay_cycles(N>>1);\
#endif
amusin
Цитата(Dimentius @ Aug 1 2007, 15:54) *
Как правильно написать макрос со структурой, зависящей от параметра?
Например, для циклов ожидания.

Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :

#define DELAY(N)\
#if (N == 1)\
NOP;\
#elif (N > 1)\
delay_cycles(N>>1);\
#endif


Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Как? Идея по ссылке http://mb9x.ginps.com/fujitsu/src/pin_macros.html

А вообще сделайте inline функцию и не парьте себе мозг.
Andy Mozzhevilov
Цитата(Dimentius @ Aug 1 2007, 15:54) *
Как правильно написать макрос со структурой, зависящей от параметра?
Например, для циклов ожидания.

Вот такая конструкция НЕПРАВИЛЬНАЯ, но смысл должен быть понятен :

#define DELAY(N)\
#if (N == 1)\
NOP;\
#elif (N > 1)\
delay_cycles(N>>1);\
#endif

Код
#define DELAY(N)\
    if (N == 1)\
        NOP;\
    else if (N > 1)\
       delay_cycles(N>>1);\
#endif

нормальный компилер соптимизирует
Dimentius
Цитата(amusin @ Aug 1 2007, 17:15) *
Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно.

Константа, но НЕ из "фиксированного набора"(в вашем примере с ножками это 'H' и 'L')

Цитата(Andy Mozzhevilov @ Aug 1 2007, 17:26) *
Код
#define DELAY(N)\
    if (N == 1)\
        NOP;\
    else if (N > 1)\
       delay_cycles(N>>1);\
#endif

нормальный компилер соптимизирует

Хм.. скорее всего соптимизирует.

Но все же хотелось надеяться на препроцессор, неужели им никак?
Andy Mozzhevilov
Цитата(Dimentius @ Aug 1 2007, 16:35) *
Константа, но НЕ из "фиксированного набора"(в вашем примере с ножками это 'H' и 'L')
Хм.. скорее всего соптимизирует.

Но все же хотелось надеяться на препроцессор, неужели им никак?


Зачем? Важен результат, или способ, которым он достигнут?
Dimentius
Цитата(Andy Mozzhevilov @ Aug 1 2007, 17:38) *
Зачем? Важен результат, или способ, которым он достигнут?

Результат, но читаемость листинга после препроцессора будет хуже.
Все равно спасибо за идею.
Andy Mozzhevilov
Цитата(Dimentius @ Aug 1 2007, 16:45) *
Результат, но читаемость листинга после препроцессора будет хуже.
Все равно спасибо за идею.

зачем его читать то? если не секрет? smile.gif
tag
Цитата(amusin @ Aug 1 2007, 14:15) *
Если N - переменная, то нельзя. Если константа из фиксированного набора значений и известная в момент компиляции, то можно. Как? Идея по ссылке http://mb9x.ginps.com/fujitsu/src/pin_macros.html

А вообще сделайте inline функцию и не парьте себе мозг.



... inline функции не входят в стандартный С, а только в С++, и потом чем плох макровызов?
Dimentius
Цитата(Andy Mozzhevilov @ Aug 1 2007, 17:51) *
зачем его читать то? если не секрет? smile.gif

Обычно при отладке, читают и С и ASM
Andy Mozzhevilov
Цитата(Dimentius @ Aug 1 2007, 17:01) *
Обычно при отладке, читают и С и ASM

ну не думаю, что пытливый ум программиста введет в заблуждение такая ерунда
Dimentius
Цитата(Andy Mozzhevilov @ Aug 1 2007, 18:05) *
ну не думаю, что пытливый ум программиста введет в заблуждение такая ерунда

В заблуждение не введет, но лишние данные будут присутствовать. А если учесть, что в макросе условий не два, а больше, и идет несколько макросов подряд? Тогда уже приличная "портянка" получается.
reddot
Цитата
... inline функции не входят в стандартный С, а только в С++
в стандартный си стандарта 99 года входят inline-функции. и набор компиляторов gnu с ними прекрасно справляется.
WiseAlex
boost::preprocessor
там есть и IF и прочее (вплоть до циклов (мне даже приходилось делать вложенные smile.gif ) )
если лень таскать целый целый boost можно практически безболезненно выдрать пару файлов из preprocessor и в путь
--
основная идея в следующем

#define if0(Param1,Param2) Param2
#define if1(Param1,Param2) Param1
#define if2(Param1,Param2) Param1
...

#define if(N,b,c) if##N(b,c)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.