|
Можно ли в keil разбить #define на несколько строк ? |
|
|
|
Sep 27 2013, 13:35
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(megajohn @ Sep 27 2013, 16:53)  Код #define VOLTAGE_RANGE_1 {\ PWR->CR &=~ PWR_CR_VOS_1;\ PWR->CR |= PWR_CR_VOS_0; } Спасибо ! Цитата(MrYuran @ Sep 27 2013, 17:23)  и обязательно в скобках do{}while(0) Не понимаю о чём речь. Объясните пожалуйста. Что в скобках ?
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Sep 27 2013, 14:48
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(MiklPolikov @ Sep 27 2013, 17:35)  Не понимаю о чём речь. Объясните пожалуйста. Что в скобках ? Речь вот о чём. При использовании VOLTAGE_RANGE_1 в Вашей программе будет подставлено (содержимое скобок опустил): {...} Обычно, при оформлении программ, после VOLTAGE_RANGE_1 ставит точку с запятой, чтобы было похоже на "настоящий" оператор. Например, так: Код if(xxx) VOLTAGE_RANGE_1; После подстановки значения будет Код if(xxx) {...}; В данном примере "лишняя" точка с запятой не помешает, но - что получится при такой конструкции ? Код if(xxx) VOLTAGE_RANGE_1; else .... Вот тут точка с запятой окажется лишней. Чтобы она лишней не оказалась, то обрамляют фигурные скобки оператором do ... while(0) Код #define VOLTAGE_RANGE_1 do {\ PWR->CR &=~ PWR_CR_VOS_1;\ PWR->CR |= PWR_CR_VOS_0; } while(0)
|
|
|
|
|
Sep 27 2013, 14:56
|

Гуру
     
Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702

|
Цитата(Палыч @ Sep 27 2013, 18:48)  Речь вот о чём. При использовании VOLTAGE_RANGE_1 в Вашей программе будет подставлено (содержимое скобок опустил): {...} Обычно, при оформлении программ, после VOLTAGE_RANGE_1 ставит точку с запятой, чтобы было похоже на "настоящий" оператор. Например, так: Код if(xxx) VOLTAGE_RANGE_1; После подстановки значения будет Код if(xxx) {...}; В данном примере "лишняя" точка с запятой не помешает, но - что получится при такой конструкции ? Код if(xxx) VOLTAGE_RANGE_1; else .... Вот тут точка с запятой окажется лишней. Чтобы она лишней не оказалась, то обрамляют фигурные скобки оператором do ... while(0) Код #define VOLTAGE_RANGE_1 do {\ PWR->CR &=~ PWR_CR_VOS_1;\ PWR->CR |= PWR_CR_VOS_0; } while(0) Спасибо!
--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
|
|
|
|
|
Sep 27 2013, 16:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
А почему не делать так: Код __INLINE void VOLTAGE_RANGE_1(void} { PWR->CR &=~ PWR_CR_VOS_1; PWR->CR |= PWR_CR_VOS_0; } ? и вызывать где угодно как VOLTAGE_RANGE_1(); По моему, так понятнее, без do..while.
|
|
|
|
|
Sep 27 2013, 19:14
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(ViKo @ Sep 27 2013, 21:55)  А я иногда делаю так Код #define WDELAY_RESTART(); \ TIM7->EGR = TIM_EGR_UG; \ TIM7->SR = 0; \ TIM7->CR1 |= TIM_CR1_CEN; Не буду оппонировать "монстрам от программирования", но случаи "а если..." мне кажутся надуманными. Чудовищно. В этом случае if(xxx) WDELAY_RESTART(); просто молча породит неправильный код. Вам кажется надуманным использование оператора "if"? Цитата(Allregia @ Sep 27 2013, 20:55)  По моему, так понятнее, без do..while. do {} while(0) - стандартная конструкция, она не должна быть непонятна в принципе.
|
|
|
|
|
Sep 27 2013, 19:34
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(aaarrr @ Sep 27 2013, 22:14)  Чудовищно. В этом случае if(xxx) WDELAY_RESTART(); просто молча породит неправильный код. Вам кажется надуманным использование оператора "if"? В данном случае - да. Тем более, я всегда могу написать Код if (xxx) { WDELAY_RESTART(); }
|
|
|
|
|
Sep 27 2013, 19:39
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(ViKo @ Sep 27 2013, 23:34)  В данном случае - да. Тогда рекомендую убрать (); в конце макроса, дабы сразу было видно, что это лажа, а не нормальная языковая конструкция. Цитата(ViKo @ Sep 27 2013, 23:34)  Тем более, я всегда могу написать Вы - возможно, если вспомните. А кто-то другой получит сюрприз.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|