Sólo una conjetura en cuanto a por qué podrían sugerir el uso de
do { ... } while(0,0)
sobre
do { ... } while(0)
A pesar de que no hay ninguna diferencia de comportamiento y debería haber ninguna diferencia en el costo de tiempo de ejecución entre los dos.
Supongo que la herramienta de análisis estático se queja de que el ciclo while
está controlado por una constante en el caso más simple y no cuando se usa 0,0
. La sugerencia del cliente probablemente sea solo para que no obtengan un montón de falsos positivos de la herramienta.
Por ejemplo, ocasionalmente encuentro situaciones en las que quiero tener una sentencia condicional controlada por una constante, pero el compilador se queja con una advertencia acerca de una expresión condicional que evalúa una constante. Luego tengo que saltar algunos aros para que el compilador deje de quejarse (ya que no me gusta tener advertencias espurias).
La sugerencia de su cliente es uno de los aros que he utilizado para silenciar esa advertencia, aunque en mi caso no estaba controlando un bucle while
, era para hacer frente a una afirmación de "siempre falla". Ocasionalmente, tendré un área de código que nunca debería ejecutarse (tal vez el caso predeterminado de un interruptor). En esa situación, que podría tener una afirmación de que siempre falla con algún mensaje:
assert(!"We should have never gotten here, dammit...");
Pero, al menos un compilador que utilice emite una advertencia acerca de la expresión siempre que evalúan como false. Sin embargo, si lo cambio a:
assert(("We should have never gotten here, dammit...", 0));
La advertencia desaparece, y todo el mundo está contento. Supongo que incluso la herramienta de análisis estático de tu cliente también lo sería.Tenga en cuenta que por lo general oculto ese poco de saltar aro detrás de una macro como:
#define ASSERT_FAIL(x) assert(((x), 0))
Podría ser agradable ser capaz de decirle al proveedor de herramientas para solucionar el problema, pero puede haber casos legítimos en el que realmente no quieren para diagnosticar un bucle controlado por una expresión booleana constante. Por no mencionar el hecho de que, incluso si convence a un vendedor de herramientas para que haga ese cambio, eso no le ayudará durante el próximo año o así que le tome realmente arreglarlo.
La herramienta de análisis estático de su cliente era demasiado, eso es seguro. –
Me gustaría "demasiado demasiado redundante". –
No puedo pensar en ninguna razón para hacer esto. Tal vez alguna herramienta se queja con una condición while (0) en la línea de "esto nunca sucederá", pero cualquier herramienta debería 1) reconocer que esta es una expresión muy común en C con macros y 2) diferenciar entre do ... mientras (0) y mientras (0) {}. ¿Les has pedido un razonamiento? –