Jump to content

    

Можно ли в keil разбить #define на несколько строк ?

Вопрос : есть ли способ в 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;}

 

?

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
#define VOLTAGE_RANGE_1    {\
PWR->CR &=~ PWR_CR_VOS_1;\ 
PWR->CR |= PWR_CR_VOS_0; }

Спасибо !

 

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

 

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

Share this post


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

Речь вот о чём. При использовании 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)

Share this post


Link to post
Share on other sites
Речь вот о чём. При использовании 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)

 

 

Спасибо!

 

Share this post


Link to post
Share on other sites

А почему не делать так:

__INLINE void VOLTAGE_RANGE_1(void} {
    PWR->CR &=~ PWR_CR_VOS_1;
    PWR->CR |= PWR_CR_VOS_0;
}

?

 

и вызывать где угодно как VOLTAGE_RANGE_1();

 

По моему, так понятнее, без do..while.

 

Share this post


Link to post
Share on other sites

А я иногда делаю так

#define WDELAY_RESTART();        \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;                \
  TIM7->CR1 |= TIM_CR1_CEN;

Не буду оппонировать "монстрам от программирования", но случаи "а если..." мне кажутся надуманными.

Share this post


Link to post
Share on other sites
А я иногда делаю так

#define WDELAY_RESTART();        \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;                \
  TIM7->CR1 |= TIM_CR1_CEN;

Не буду оппонировать "монстрам от программирования", но случаи "а если..." мне кажутся надуманными.

Чудовищно. В этом случае if(xxx) WDELAY_RESTART(); просто молча породит неправильный код.

Вам кажется надуманным использование оператора "if"?

 

 

 

По моему, так понятнее, без do..while.

do {} while(0) - стандартная конструкция, она не должна быть непонятна в принципе.

Share this post


Link to post
Share on other sites
do {} while(0) - стандартная конструкция, она не должна быть непонятна в принципе.

 

Да, но не в этом случае, и чем хуже инлайн?

Share this post


Link to post
Share on other sites
Да, но не в этом случае, и чем хуже инлайн?

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

 

Инлайн ничем не хуже, кроме того, что собственно встраивание не гарантируется. А если, например, нужно вернуть из блока значение, то без инлайна никак.

Share this post


Link to post
Share on other sites
Чудовищно. В этом случае if(xxx) WDELAY_RESTART(); просто молча породит неправильный код.

Вам кажется надуманным использование оператора "if"?

В данном случае - да.

Тем более, я всегда могу написать

if (xxx) {
  WDELAY_RESTART();
}

Share this post


Link to post
Share on other sites
В данном случае - да.

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

 

Тем более, я всегда могу написать

Вы - возможно, если вспомните. А кто-то другой получит сюрприз.

Share this post


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

Вы - возможно, если вспомните. А кто-то другой получит сюрприз.

На то даны БОЛЬШИЕ_БУКВЫ.

Share this post


Link to post
Share on other sites
На то даны БОЛЬШИЕ_БУКВЫ.

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

 

Зачем писать нарочито плохо, если можно без каких бы то ни было усилий написать хорошо и правильно?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this