Вопросы по Макросам с аргументами в Си
27.11.2013, 16:02
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Вопросы по Макросам с аргументами в Си
Для удобства работы с портами ввода/вывода (на STM32 в Keil) написал небольшой хидер, приведу его часть :
|
Код:
|
#define SbitP(Port,Nbit) GPIO##Port-›BSRR=GPIO_BSRR_BS##Nbit
#define RbitP(Port,Nbit) GPIO##Port-›BSRR=GPIO_BSRR_BR##Nbit
#define SmbitP(Port,mask) GPIO##Port-›BSRR=(mask)
#define RmbitP(Port,mask) GPIO##Port-›BSRR=(mask)‹‹16 |
в программе использую следующие варианты включения макросов:
|
Код:
|
#define LCD_dataShift 1
void LCD_wrAdr (u8 Adr)
{
SmbitP(A,((Adr&0x0f)‹‹LCD_dataShift)); // выставляем на шину адрес
RbitP(A,7); // вкл. на запись адреса A0=0
SbitP(A,5); // вкл.строба записи
delay(2000);// Задержка ~ 100нс
RbitP(A,5); // снимаем строб записи
RmbitP(A,(0x0f‹‹LCD_dataShift)); // Сброс битов шины DBх
delay(5000);// Задержка ~ 200нс
} |
У меня вопрос: на сколько корректно такое применение макросов ? т.к. в случае с RbitP(A,7) в макрос подставляется символ , который при обединение с остальным текстом сам является библиотечным макросом. Т.е. до каких пор происходит раскрытие макроса ?
|
|
|
|
27.11.2013, 16:26
|
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
Вот из-за такого применения макросов и появилось мнение "Макросы - зло!", и здесь я полностью согласен, теряется и наглядность, и смысл. Читать подобный текст только глаза и мозг убивать, ффтопку!
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо nahimovv за это сообщение:
|
|
|
27.11.2013, 16:53
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
nahimovv, это еще цветочки. Полюбуйтесь на мое творчество (особенно то, что в моем собственном ответе).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
28.11.2013, 10:45
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
eddy, вы виртуоз по макросам )
|
|
|
|
17.01.2014, 15:42
|
|
|
Временная регистрация
Регистрация: 09.10.2007
Адрес: Odawara, Kanagawa, Japan
Сообщений: 57
Сказал спасибо: 15
Сказали Спасибо 35 раз(а) в 23 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
Сообщение от MaxiMuz79
|
|
до каких пор происходит раскрытие макроса ?
|
Если воспользоваться опцией -E для gcc, то на выходе получится сишный код после препроцессора, где можно наглядно посмотреть, до каких пор раскрылись макросы и что из них получилось.
|
|
|
|
02.07.2014, 16:34
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
Определяю макрос:
|
Код:
|
#define _OUTPIN_PPL(port,nbit) do { GPIO##port-›CRL&=~(GPIO_CRL_CNF##nbit); GPIO##port-›CRL|=GPIO_CRL_MODE##nbit ; } while (0);
#define _OUTPIN_PPH(port,nbit) do { GPIO##port-›CRH&=~(GPIO_CRH_CNF##nbit); GPIO##port-›CRH|=GPIO_CRH_MODE##nbit; } while (0);
#define OUTPIN_PP(port,nbit) (nbit‹8) ? _OUTPIN_PPL(port,(nbit)) : _OUTPIN_PPH(port,(nbit)) |
на выражение в программе: компилятор ругается:
main\LT_cdt1.c(110): error: #29: expected an expression
main\LT_cdt1.c(110): error: #53: expected a ":"
main\LT_cdt1.c(110): error: #29: expected an expression
Чего тут не так ?
|
|
|
|
02.07.2014, 18:18
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
Сообщение от MaxiMuz79
|
|
Чего тут не так ?
|
Он разворачивается вот в такой бред:
|
Код:
|
(9‹8) ? do { GPIOA-›CRL&=~(GPIO_CRL_CNF(9)); GPIOA-›CRL|=GPIO_CRL_MODE(9) ; } while (0); : do { GPIOA-›CRH&=~(GPIO_CRH_CNF(9)); GPIOA-›CRH|=GPIO_CRH_MODE(9); } while (0);; |
Потому что макрос кривой. Нельзя точку с запятой в конце #define писать
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
03.07.2014, 13:44
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
Сообщение от eddy
|
|
Потому что макрос кривой. Нельзя точку с запятой в конце #define писать
|
Да, точку с запятой в очередной пробе забыл убрать, но ошибка не в ней.
|
|
|
|
03.07.2014, 13:53
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
Сообщение от MaxiMuz79
|
|
Да, точку с запятой в очередной пробе забыл убрать, но ошибка не в ней.
|
Видимо, из-за do{}while(0);
Вот такой сишный код валиден:
|
Код:
|
i%2 ? printf("yes\n") : printf("no\n"); |
а такой - нет:
|
Код:
|
i%2 ? do{ printf("yes\n");} while(0) : do{printf("no\n");}while(0); |
Не надо пихать везде тернарные выражения. Неужто нельзя просто написать
|
Код:
|
if(i%2) do{ printf("yes\n");} while(0); else do{printf("no\n");}while(0); |
?
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
04.07.2014, 18:31
|
|
|
Гражданин KAZUS.RUN
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Вопросы по Макросам с аргументами в Си
Сообщение от eddy
|
Не надо пихать везде тернарные выражения. Неужто нельзя просто написать
|
Код:
|
if(i%2) do{ printf("yes\n");} while(0); else do{printf("no\n");}while(0); |
?
|
Вставит ли в этом случае компилятор Keil условие вместо дефайна или все таки заменит его одной командой ?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:23.
|
|