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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Можно ли в keil разбить #define на несколько строк ?
MiklPolikov
сообщение Sep 27 2013, 12:48
Сообщение #1


Гуру
******

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



Вопрос : есть ли способ в Keil записать такую строку

#define VOLTAGE_RANGE_1 {PWR->CR &=~ PWR_CR_VOS_1; PWR->CR |= PWR_CR_VOS_0;}

в виде двух

#define VOLTAGE_RANGE_1 {PWR->CR &=~ PWR_CR_VOS_1;
PWR->CR |= PWR_CR_VOS_0;}

?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
megajohn
сообщение Sep 27 2013, 12:53
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Код
#define VOLTAGE_RANGE_1    {\
PWR->CR &=~ PWR_CR_VOS_1;\
PWR->CR |= PWR_CR_VOS_0; }



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 27 2013, 13:23
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



и обязательно в скобках do{}while(0)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Sep 27 2013, 13:35
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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)


Не понимаю о чём речь. Объясните пожалуйста. Что в скобках ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 27 2013, 14:48
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Sep 27 2013, 14:56
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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)



Спасибо!


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 27 2013, 16:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2013, 17:55
Сообщение #8


Универсальный солдатик
******

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



А я иногда делаю так
Код
#define WDELAY_RESTART();        \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;                \
  TIM7->CR1 |= TIM_CR1_CEN;

Не буду оппонировать "монстрам от программирования", но случаи "а если..." мне кажутся надуманными.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 19:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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) - стандартная конструкция, она не должна быть непонятна в принципе.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Sep 27 2013, 19:21
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(aaarrr @ Sep 27 2013, 21:14) *
do {} while(0) - стандартная конструкция, она не должна быть непонятна в принципе.


Да, но не в этом случае, и чем хуже инлайн?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 19:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Allregia @ Sep 27 2013, 23:21) *
Да, но не в этом случае, и чем хуже инлайн?

Почему не в этом случае?

Инлайн ничем не хуже, кроме того, что собственно встраивание не гарантируется. А если, например, нужно вернуть из блока значение, то без инлайна никак.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2013, 19:34
Сообщение #12


Универсальный солдатик
******

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



Цитата(aaarrr @ Sep 27 2013, 22:14) *
Чудовищно. В этом случае if(xxx) WDELAY_RESTART(); просто молча породит неправильный код.
Вам кажется надуманным использование оператора "if"?

В данном случае - да.
Тем более, я всегда могу написать
Код
if (xxx) {
  WDELAY_RESTART();
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 19:39
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Sep 27 2013, 23:34) *
В данном случае - да.

Тогда рекомендую убрать (); в конце макроса, дабы сразу было видно, что это лажа, а не нормальная языковая конструкция.

Цитата(ViKo @ Sep 27 2013, 23:34) *
Тем более, я всегда могу написать

Вы - возможно, если вспомните. А кто-то другой получит сюрприз.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2013, 19:41
Сообщение #14


Универсальный солдатик
******

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



Цитата(aaarrr @ Sep 27 2013, 22:39) *
Тогда рекомендую убрать (); в конце макроса, дабы сразу было видно, что это лажа, а не нормальная языковая конструкция.
Вы - возможно, если вспомните. А кто-то другой получит сюрприз.

На то даны БОЛЬШИЕ_БУКВЫ.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 19:44
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Sep 27 2013, 23:41) *
На то даны БОЛЬШИЕ_БУКВЫ.

Т.е. теперь БОЛЬШИЕ_БУКВЫ всегда оборачивать в {} безопасности для?

Зачем писать нарочито плохо, если можно без каких бы то ни было усилий написать хорошо и правильно?
Go to the top of the page
 
+Quote Post

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

 


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


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