¿Es válido C para declarar una estructura y definir valores encerrados en {}?

¿Es válido C para declarar una estructura y definir valores encerrados en {}?

struct name new_name[] {
    {"value1"},
    {"value2"},
    {"value3"},
}

Dónde:

struct name {
    union {
        char *value1;
    } n_u;

    char *value2;
}

preguntado el 01 de julio de 12 a las 04:07

Publique el código dentro de su pregunta. No haga preguntas que dependan de enlaces externos para ser significativas. Mejor aún, haga su pregunta genérica. No hay absolutamente ninguna razón para vincular a ese archivo. Publique la sintaxis relevante y pregunte "¿Es esta sintaxis válida?" -

Traté de publicar el código, pero no pude obtener la sintaxis correcta para que se aceptara como una pregunta. -

Sangre el código por 4 espacios, o selecciónelo y haga clic en el {} botón. Tal como está, ni siquiera ha proporcionado un número de línea, solo un enlace a un archivo de 600 líneas. -

1 Respuestas

Lo que ha publicado no es válido porque falta un signo igual antes del inicializador (y también puntos y comas al final). De lo contrario, es legal pero algo difícil de leer porque no inicializa todos los campos y no usa un conjunto completo de llaves. En un inicializador completamente reforzado, tendrá un par de llaves alrededor de la lista de valores para cada matriz, estructura o unión. En este caso, tiene una matriz de estructuras con uniones, por lo que debe haber 3 niveles de llaves para una legibilidad óptima. Un equivalente con todo lo explicado es:

struct name new_name[] = {
    {{"value1"}, NULL},
    {{"value2"}, NULL},
    {{"value3"}, NULL},
};

Respondido 01 Jul 12, 05:07

+1 por minuciosidad / explicación de mejores prácticas. Solo para confirmar que esto se compila correctamente: ¿la estructura contiene char * y luego se inicia en un literal de cadena? - djechlin

Además, en realidad no tiene sentido declarar una unión de 1 miembro a menos que necesite campos de bits o esté tratando de hacer algo divertido como obligar a su miembro a alinearse en los límites de las palabras... lo cual no importa en este caso porque su unión tiene un solo char * miembro por lo que es de 4 u 8 bytes de todos modos. - dcow

@djechlin sí, está permitido inicializar un char * con un literal de cadena. La cadena se colocará en un área de memoria separada, en la que es posible que no se pueda escribir, por lo que es mejor usar un const char * para el tipo si puede. - alan curry

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.