Estilo de codificación en el código HAL STM32

3

Mientras estaba leyendo los controladores HAL de STM32 para los temporizadores, encontré esta macro:

#define __HAL_TIM_DISABLE(__HANDLE__) \
                    do { \
                      if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0U) \
                      { \
                        (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \
                      } \
                    } while(0)

Como la parte while siempre es incorrecta, básicamente no debería haber ningún bucle, y el do-while me parece redundante. Pero ya que lo distribuyen en la HAL de esta manera, ¿supongo que hay algún punto? ¿Alguien puede señalar cuál?

    
pregunta Paul Würtz

1 respuesta

3

Un do { something; } while (0) es un patrón típico en macros, donde desea asegurarse de que todas las instrucciones se ejecuten.

Ejemplo de por qué esto es importante:

#define MY_MACRO() do_something1(); do_something2()

Esto funcionará:

MY_MACRO();

pero esto no funcionará como estaba previsto:

if (some_condition) MY_MACRO();

porque será preprocesado en:

if (some_condition) do_something1(); do_something2();

La segunda declaración se ejecutará sin importar lo que diga la condición.

Un do { ... } while(0) es solo una forma conveniente de hacer un bloque de código. De todos modos, el compilador lo optimizará, por lo que en realidad no hay bucles involucrados ni sobrecarga de tiempo de ejecución.

    
respondido por el filo

Lea otras preguntas en las etiquetas