Estoy usando tablas de cadenas literales mucho en mi código C. Todas estas tablas se parecen más o menos a esto:
static const char* const stateNames[STATE_AMOUNT] =
{
"Init state",
"Run state",
"Pause state",
"Error state",
};
El problema con el código anterior es que si la tabla se alarga y se modifica durante el desarrollo, de vez en cuando olvido una coma. El código se compila sin problemas con una coma faltante, pero mi programa termina fallando cuando se configura la última cadena NULL
. Usé los compiladores MinGW y Keil para verificar.
¿Hay alguna forma de generar una advertencia de compilación para mi inicialización si falta la coma?
c
initialization
Jonny Schubert
fuente
fuente
Respuestas:
Envolver cada uno
const char*
en un par de paréntesis debería resolver el problema como se muestra en el siguiente fragmento:Si olvida una coma, obtendrá un error de compilación similar a:
error: called object is not a function or function pointer
DEMO EN VIVO
Tenga en cuenta que si olvida la coma, lo que realmente sucede es que C realmente concatenará las dos (o más) cadenas hasta la próxima coma, o al final de la matriz. Por ejemplo, supongamos que olvida la coma como se muestra a continuación:
Esto es lo que
gcc-9.2
genera (otros compiladores generan código similar):Está claro que las últimas tres cadenas están concatenadas y la matriz no tiene la longitud que cabría esperar.
fuente
Puede dejar que el compilador cuente la matriz y genere un mensaje de error si se produce un resultado inesperado:
Vea este hilo para ideas para implementar
_Static_assert
si su compilador es muy antiguo y no lo admite.Como beneficio adicional, esto también puede ayudar cuando agrega nuevos estados pero se olvida de actualizar la tabla de cadenas. Pero es posible que también desee estudiar X Macros.
fuente
Siempre he usado una referencia a una matriz de tamaño explícito para resolver esto.
http://coliru.stacked-crooked.com/a/593fc2eac80782a6
fuente
Esto no trae el compilador para ayudarlo, pero creo que escribirlo a continuación hace que sea más fácil para los humanos no soltar una coma:
fuente