Pregunta

¿Hay alguna razón específica por la cual no se ha agregado soporte para inicializadores designados a G ++? ¿Es la razón por la que los estándares C99 llegaron tarde y G ++ se desarrolló antes y luego a las personas no se preocuparon por este problema, o hay alguna dificultad inherente en la implementación de inicializadores designados en la gramática de C ++?

¿Fue útil?

Solución

Como señalé en un comentario, G ++ no admite iniciales designados estándar C99, pero sí admite la extensión de GNU a C90 que permite iniciales designados. Entonces esto no funciona:

union value_t {
    char * v_cp;
    float v_f;
};
union value_t my_val = { .v_f = 3.5f };

Pero esto lo hace:

union value_t my_val = { v_f: 3.5f };

Esta parece ser una mala interacción de la coordinación entre los comités de estándares C y C ++ (no hay una razón particularmente buena por la cual C ++ no apoya la sintaxis C99, simplemente no lo han considerado) y la política de GCC (C ++ no debería ' T es compatible con la sintaxis C99 solo porque está en C99, pero debería admitir la sintaxis de extensión GNU que logra exactamente lo mismo porque es una extensión de GNU que se puede aplicar a cualquier idioma).

Otros consejos

Hoy me encontré con este mismo problema. G ++ con -std = C ++ 11 y C ++ 14 admite inicializadores designados, pero aún puede obtener un error de compilación "Test.cxx: 78: 9: Lo siento, sin implementar: inicializadores designados no triviales no compatibles" si usted No inicialice la estructura en el orden en que se han definido sus miembros. Como ejemplo

struct x
{
    int a;
    int b;
};

// This is correct
struct x x_1 = {.a = 1, .b = 2};
// This will fail to compile with error non-trivial designated initializer
struct x x_2 = {.b = 1, .a = 2};

C ++ no admite esto. Ni siquiera estará en los estándares C ++ 0x, parece: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1

Además, ¿por qué intentas compilar el núcleo de Linux con G ++?

Al menos G ++-4.8 Esto ahora se admite de forma predeterminada.

Será Oficialmente apoyado en C ++ 20, y es ya implementado en G ++ 8.2 (incluso sin el std=c++2a bandera).

¿Qué pasa con los uniones anónimas?

En CI puede tener esto:

struct vardir_entry {
    const uint16_t id;
    const uint8_t sub;
    const char *name;
    const uint8_t type;

    const union {   
        struct vardir_lookup lookup;
        struct vardir_min_max_conf minmax;       
    };

    const union {
        const struct vardir_value_target_const const_value;
        const struct vardir_value_target value;
    };
};

E inicializado así:

static const struct vardir_entry _directory[]{
        { .id = 0xefef, .sub = 0, .name = "test", .type = VAR_UINT32, .minmax = { .min = 0, .max = 1000 }, .value = VARDIR_ENTRY_VALUE(struct obj, &obj, member) }
    };

Sin embargo, bajo G ++, incluso con C ++ 14, esto da el mismo error "Lo siento, sin implementar". Necesitamos poder definir las variables C en C ++ cuando al menos queremos unir el código C con el marco de prueba C ++. El hecho de que una característica tan valiosa de C no sea compatible es una pena.

Acode ahttp://gcc.gnu.org/c99status.htmlLos inicializadores designados ya se han implementado.

¿Qué versión de G ++ usas? (Prueba G ++ - Versión)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top