Quiero inicializar un elemento de estructura, dividido en declaración e inicialización. Esto es lo que tengo:
typedef struct MY_TYPE {
bool flag;
short int value;
double stuff;
} MY_TYPE;
void function(void) {
MY_TYPE a;
...
a = { true, 15, 0.123 }
}
¿Es esta la forma de declarar e inicializar una variable local de MY_TYPE
acuerdo con los estándares del lenguaje de programación C (C89, C90, C99, C11, etc.)? ¿O hay algo mejor o al menos funciona?
Actualización Terminé teniendo un elemento de inicialización estático donde configuré cada subelemento según mis necesidades.
c
struct
initialization
encogerse
fuente
fuente
Respuestas:
En (ANSI) C99, puede usar un inicializador designado para inicializar una estructura:
Editar: Otros miembros se inicializan como cero: "Los miembros de campo omitidos se inicializan implícitamente igual que los objetos que tienen una duración de almacenamiento estático". ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )
fuente
Puedes hacerlo con un literal compuesto . Según esa página, funciona en C99 (que también cuenta como ANSI C ).
Las designaciones en los inicializadores son opcionales; también podrías escribir:
fuente
Veo que ya ha recibido una respuesta sobre ANSI C 99, así que voy a echar un vistazo sobre ANSI C 89. ANSI C 89 le permite inicializar una estructura de esta manera:
Una cosa importante para recordar, en el momento en que inicialice incluso un objeto / variable en la estructura, todas sus otras variables se inicializarán al valor predeterminado.
Si no inicializa los valores en su estructura, todas las variables contendrán "valores basura".
¡Buena suerte!
fuente
a = (MYTYPE){ true, 15, 0.123 };
haría bien en C99
fuente
Casi lo tienes ...
La búsqueda rápida en 'struct initialize c' me muestra esto
fuente
El lenguaje de programación estándar ISO / IEC 9899: 1999 (comúnmente conocido como C99) permite utilizar un inicializador designado para inicializar miembros de una estructura o unión de la siguiente manera:
Se define en la
paragraph 7
sección6.7.8 Initialization
de la norma ISO / IEC 9899: 1999 como:Tenga en cuenta que
paragraph 9
de la misma sección establece que:Sin embargo, en la implementación de GNU GCC, los miembros omitidos se inicializan como valor apropiado para el tipo cero o similar a cero. Como se indica en la sección 6.27 Inicializadores designados de la documentación de GNU GCC:
El compilador de Microsoft Visual C ++ debe admitir inicializadores designados desde la versión 2013 según la publicación oficial del blog C ++ Conformance Roadmap . El párrafo
Initializing unions and structs
del artículo Inicializadores en la documentación de MSDN Visual Studio sugiere que los miembros sin nombre se inicializaron a valores apropiados similares a cero de manera similar a GNU GCC.El estándar ISO / IEC 9899: 2011 (comúnmente conocido como C11) que había reemplazado al ISO / IEC 9899: 1999 conserva los inicializadores designados en la sección
6.7.9 Initialization
. También conservaparagraph 9
sin cambios.El nuevo estándar ISO / IEC 9899: 2018 (comúnmente conocido como C18) que había reemplazado a ISO / IEC 9899: 2011 conserva los inicializadores designados en la sección
6.7.9 Initialization
. También conservaparagraph 9
sin cambios.fuente
struct thing { union { char ch; int i; }; };
. Más adelante, el estándar dice: "Si hay menos inicializadores en una lista entre llaves que elementos o miembros de un agregado, o menos caracteres en un literal de cadena utilizado para inicializar una matriz de tamaño conocido que elementos en la matriz, el resto del agregado se inicializará implícitamente igual que los objetos que tienen una duración de almacenamiento estático ".como dijo Ron Nuni:
Una cosa importante para recordar: en el momento en que inicialice incluso un objeto / variable en la estructura, todas sus otras variables se inicializarán al valor predeterminado.
Si no inicializa los valores en su estructura (es decir, si solo declara esa variable), todos
variable.members
contendrán "valores basura", solo si la declaración es local!Si la declaración es global o estática (como en este caso), todos los no
variable.members
inicializados se inicializarán automáticamente para:0
para enteros y coma flotante'\0'
parachar
(por supuesto, esto es lo mismo que0
, ychar
es un tipo entero)NULL
para punterosfuente
fuente
Si MS no se ha actualizado a C99, MY_TYPE a = {true, 15,0.123};
fuente
Encontré otra forma de inicializar estructuras.
La estructura:
Inicializacion:
Según la documentación de GCC, esta sintaxis es obsoleta desde GCC 2.5 .
fuente
No me gustó ninguna de estas respuestas, así que hice la mía. No sé si esto es ANSI C o no, es solo GCC 4.2.1 en su modo predeterminado. Nunca recuerdo el paréntesis, así que comienzo con un subconjunto de mis datos y lucho con los mensajes de error del compilador hasta que se cierra. La legibilidad es mi primera prioridad.
Los datos pueden comenzar como un archivo delimitado por tabulaciones que usted busca, reemplaza para dar masajes a otra cosa. Sí, esto es cosa de Debian. Entonces, un par externo de {} (que indica la matriz), luego otro par para cada estructura interna. Con comas entre. Poner cosas en un encabezado no es estrictamente necesario, pero tengo alrededor de 50 elementos en mi estructura, así que los quiero en un archivo separado, tanto para mantener el desorden de mi código como para que sea más fácil de reemplazar.
fuente
La estructura en C se puede declarar e inicializar así:
fuente
Ya he leído la documentación de Microsoft Visual Studio 2015 para inicializar tipos agregados , todas las formas de inicialización con
{...}
se explican allí, pero la inicialización con punto, llamada '' designador '' no se menciona allí. No funciona tampoco.El capítulo estándar C99 6.7.8 Inicialización explica la posibilidad de designadores, pero en mi opinión no está realmente claro para estructuras complejas. El estándar C99 como pdf .
En mi opinión, puede ser mejor
= {0};
inicialización para todos los datos estáticos. Es menos esfuerzo para el código de la máquina.Use macros para inicializar, por ejemplo
typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}
La macro se puede adaptar, su lista de argumentos puede ser independiente del contenido de la estructura modificada. Es apropiado si se deben inicializar menos elementos. También es apropiado para estructuras anidadas. 3. Una forma simple es: Inicializar en una subrutina:
Esta rutina se parece a ObjectOriented en C. ¡Use
thiz
, nothis
para compilarla también con C ++!fuente
He estado buscando una buena manera de inicializar mi estructura, y tengo que usar el siguiente (C99). Esto me permite inicializar una sola estructura o una matriz de estructuras de la misma manera que los tipos simples.
Esto se puede usar en el código como:
fuente
jsmn_ts_default
, pero el resto de las estructuras se inicializan como si la matriz tuviera una duración de almacenamiento estático, lo que significa que los miembros se inicializan enNULL
y0
. Pero si cambia a#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}
, verá que solo el primer elemento de la matriz se inicializa.int a[10] = {1};
Solo el primer elemento será==1