Jump to content

    
Sign in to follow this  
MiklPolikov

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

Recommended Posts

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

Спасибо !

 

и обязательно в скобках 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
Да, но не в этом случае, и чем хуже инлайн?

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

 

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this