El primero es más fácil ( implica menos escritura ) y está garantizado que funciona, todos los miembros se establecerán en 0
[Ref 1] .
El segundo es más legible.
La elección depende de la preferencia del usuario o de la que exige su estándar de codificación.
[Ref 1] Referencia C99 Standard 6.7.8.21:
Si hay menos inicializadores en una lista entre llaves que elementos o miembros de un agregado, o menos caracteres en un literal de cadena usado para inicializar un arreglo de tamaño conocido que elementos en el arreglo, el resto del agregado deberá inicializarse implícitamente de la misma forma que los objetos que tienen una duración de almacenamiento estático.
Buena lectura:
C y C ++: inicialización parcial de la estructura automática
= {};
Sin embargo, no estoy seguro de si esto es válido.foo = {0}
significa. Si lo vierafoo = ZERO_FULL
, tendría que grep para la definición de ZERO_FULL.Si los datos son una variable estática o global, se rellenan con ceros de forma predeterminada, así que simplemente declare
myStruct _m;
Si los datos son una variable local o una zona asignada al montón, bórrelos con algo
memset
así:Los compiladores actuales (por ejemplo, versiones recientes de
gcc
) optimizan eso bastante bien en la práctica. Esto funciona solo si todos los valores cero (incluidos los punteros nulos y el punto flotante cero) se representan como todos los bits cero, lo cual es cierto en todas las plataformas que conozco (pero el estándar C permite implementaciones donde esto es falso; no conozco tal implementación) .Quizás podría codificar
myStruct m = {};
omyStruct m = {0};
(incluso si el primer miembro demyStruct
no es un escalar).Mi sensación es que usar
memset
para estructuras locales es lo mejor, y transmite mejor el hecho de que en tiempo de ejecución, algo debe hacerse (mientras que, por lo general, los datos globales y estáticos pueden entenderse como inicializados en tiempo de compilación, sin ningún costo en tiempo de ejecución) .fuente
0
sea equivalente a inicializar todos los miembros de la estructura con0
aunque. En muchas plataformas esto será cierto, pero no universalmente.{}
no es válido en C, solo está disponible en C ++.NULL
puntero que no era todo0
bits: c-faq.com/null/machexamp.html . Y luego existe la posibilidad de que la plataforma no esté usando IEEE 754 para representar valores de punto flotante, sino que use alguna otra representación que no tenga un valor total de0
bits0.0
, pero es cierto que no conozco tal plataforma.Consulte §6.7.9 Inicialización:
Entonces, sí, ambos funcionan. Tenga en cuenta que en C99 también se puede usar una nueva forma de inicialización, llamada inicialización designada:
fuente