Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Вопросы по Макросам с аргументами в Си

Непрочитано 27.11.2013, 16:02  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Вопросы по Макросам с аргументами в Си

Для удобства работы с портами ввода/вывода (на 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) в макрос подставляется символ , который при обединение с остальным текстом сам является библиотечным макросом. Т.е. до каких пор происходит раскрытие макроса ?
Реклама:
MaxiMuz79 вне форума  
Непрочитано 27.11.2013, 16:26  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: Вопросы по Макросам с аргументами в Си

Вот из-за такого применения макросов и появилось мнение "Макросы - зло!", и здесь я полностью согласен, теряется и наглядность, и смысл. Читать подобный текст только глаза и мозг убивать, ффтопку!
nahimovv вне форума  
Эти 2 пользователя(ей) сказали Спасибо nahimovv за это сообщение:
dosikus (28.11.2013), metrA85 (27.11.2013)
Непрочитано 27.11.2013, 16:53  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Вопросы по Макросам с аргументами в Си

nahimovv, это еще цветочки. Полюбуйтесь на мое творчество (особенно то, что в моем собственном ответе).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 28.11.2013, 10:45  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Вопросы по Макросам с аргументами в Си

eddy, вы виртуоз по макросам )
MaxiMuz79 вне форума  
Непрочитано 17.01.2014, 15:42  
elstop
Временная регистрация
 
Аватар для elstop
 
Регистрация: 09.10.2007
Адрес: Odawara, Kanagawa, Japan
Сообщений: 57
Сказал спасибо: 15
Сказали Спасибо 35 раз(а) в 23 сообщении(ях)
elstop на пути к лучшему
По умолчанию Re: Вопросы по Макросам с аргументами в Си

Сообщение от MaxiMuz79 Посмотреть сообщение
до каких пор происходит раскрытие макроса ?
Если воспользоваться опцией -E для gcc, то на выходе получится сишный код после препроцессора, где можно наглядно посмотреть, до каких пор раскрылись макросы и что из них получилось.
elstop вне форума  
Непрочитано 02.07.2014, 16:34  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию 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))
на выражение в программе:
Код:
OUTPIN_PP(A,9);
компилятор ругается:
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


Чего тут не так ?
MaxiMuz79 вне форума  
Непрочитано 02.07.2014, 18:18  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию 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, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 03.07.2014, 13:44  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Вопросы по Макросам с аргументами в Си

Сообщение от eddy Посмотреть сообщение
Потому что макрос кривой. Нельзя точку с запятой в конце #define писать
Да, точку с запятой в очередной пробе забыл убрать, но ошибка не в ней.
MaxiMuz79 вне форума  
Непрочитано 03.07.2014, 13:53  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию 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, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 04.07.2014, 18:31  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Вопросы по Макросам с аргументами в Си

Сообщение от eddy Посмотреть сообщение
Не надо пихать везде тернарные выражения. Неужто нельзя просто написать
Код:
if(i%2) do{ printf("yes\n");} while(0); else do{printf("no\n");}while(0);
?
Вставит ли в этом случае компилятор Keil условие вместо дефайна или все таки заменит его одной командой ?
MaxiMuz79 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы ENC28J60 CERGEI1982 Микроконтроллеры, АЦП, память и т.д 123 02.04.2018 22:30
Вопросы по радиоприемнику Alpout Делимся опытом 8 19.01.2013 10:53
Wiznet W7100. Общие вопросы R_N Микроконтроллеры, АЦП, память и т.д 7 06.06.2012 00:33
Система измерения температуры (на AD8495), вопросы по схеме и реализации spartakchamp Измерительное оборудование 2 15.11.2010 22:04


Часовой пояс GMT +4, время: 14:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.