реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Параметр макроса С, изменение макроса по передаваемому параметру
Dimentius
сообщение Aug 1 2007, 09:54
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980



Как правильно написать макрос со структурой, зависящей от параметра?
Например, для циклов ожидания.

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

#define DELAY(N)\
#if (N == 1)\
NOP;\
#elif (N > 1)\
delay_cycles(N>>1);\
#endif
Go to the top of the page
 
+Quote Post
amusin
сообщение Aug 1 2007, 10:15
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165



Цитата(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 функцию и не парьте себе мозг.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 1 2007, 10:26
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(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

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


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Dimentius
сообщение Aug 1 2007, 10:35
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980



Цитата(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

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

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

Но все же хотелось надеяться на препроцессор, неужели им никак?
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 1 2007, 10:38
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



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

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


Зачем? Важен результат, или способ, которым он достигнут?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Dimentius
сообщение Aug 1 2007, 10:45
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980



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

Результат, но читаемость листинга после препроцессора будет хуже.
Все равно спасибо за идею.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 1 2007, 10:51
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



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

зачем его читать то? если не секрет? smile.gif


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
tag
сообщение Aug 1 2007, 10:54
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



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

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



... inline функции не входят в стандартный С, а только в С++, и потом чем плох макровызов?
Go to the top of the page
 
+Quote Post
Dimentius
сообщение Aug 1 2007, 11:01
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980



Цитата(Andy Mozzhevilov @ Aug 1 2007, 17:51) *
зачем его читать то? если не секрет? smile.gif

Обычно при отладке, читают и С и ASM
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 1 2007, 11:05
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



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

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


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Dimentius
сообщение Aug 1 2007, 11:10
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980



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

В заблуждение не введет, но лишние данные будут присутствовать. А если учесть, что в макросе условий не два, а больше, и идет несколько макросов подряд? Тогда уже приличная "портянка" получается.
Go to the top of the page
 
+Quote Post
reddot
сообщение Aug 20 2007, 08:28
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 18
Регистрация: 7-06-06
Из: Зеленоград
Пользователь №: 17 843



Цитата
... inline функции не входят в стандартный С, а только в С++
в стандартный си стандарта 99 года входят inline-функции. и набор компиляторов gnu с ними прекрасно справляется.
Go to the top of the page
 
+Quote Post
WiseAlex
сообщение Nov 22 2007, 15:12
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 9-11-06
Пользователь №: 22 115



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)

Сообщение отредактировал WiseAlex - Nov 22 2007, 15:13
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 22:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016