2011-02-04 19 views
12

¿Hay alguna razón específica por la que el soporte para los inicializadores designados no se haya agregado a g ++? ¿Es la razón por la que los estándares C99 llegaron tarde y g ++ se desarrolló antes y más tarde a las personas no les importó este problema, o hay alguna dificultad inherente en la implementación de los inicializadores designados en la gramática de C++?¿Por qué los inicializadores designados no están implementados en g ++

+0

Linux está escrito en C y no en C++. g ++ es la interfaz para C++, use gcc para C. –

+0

g ++ es un compilador de C++. Use gcc. – bobbogo

+0

Hemos reescrito alguna parte del kernel de Linux en C++, por lo que es esencial para nosotros usar g ++ – Bharat

Respuesta

9

Como noté en un comentario, G ++ no es compatible con los inicializadores designados estándar C99, pero admite la extensión GNU a C90 que permite los inicializadores designados. Así que esto no funciona:

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

Pero esto hace:

union value_t my_val = { v_f: 3.5f }; 

Ésta parece ser una mala interacción de coordinación entre los comités de normalización C y C++ (no hay sobre todo una buena razón por qué C++ no admite la sintaxis C99, simplemente no lo han considerado) y política GCC (C++ no debería ser compatible con la sintaxis C99 solo porque está en C99, pero debería ser compatible con 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).

+1

esto ya no es cierto en g ++ - 5.2 y probablemente se remonta al menos hasta g ++ - 4.8 – Catskul

+1

Bueno, la respuesta fue en 2012. – Tom

+2

Sí, lo siento, eso fue una nota para los lectores en lugar de una corrección per se. – Catskul

-2

Contabilidad a http://gcc.gnu.org/c99status.html inicializadores designados ya se han implementado.

¿Qué versión de g ++ usas? (Pruebe la versión de g ++)

+3

Eso es C99, no C++. No creo que todas las características de C99 sean respaldadas implícitamente por g ++. – Maister

+0

Quizás no utilice el "modo C" –

+0

g ++ admite C. Pruebe g ++ -X c –

12

Me encontré con este mismo problema hoy. 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, no implementado: los inicializadores designados no triviales no son compatibles" si no inicialice la estructura en el orden en que se han definido sus miembros. Como un 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}; 
+1

Los inicializadores designados aún no forman parte de ninguna versión de C++ estándar. – Quentin

+0

@Quentin Corregido ahora. –

1

Al menos desde g ++ - 4.8 ahora es compatible de forma predeterminada.

0

¿Qué hay de las uniones anónimas?

En C puedo 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; 
    }; 
}; 

y se inicializa como esto:

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 "lo siento, sin aplicarse" error. Necesitamos poder definir variables de C en C++ cuando por lo menos queremos probar el código de C con el marco de prueba de C++. El hecho de que una característica tan valiosa de C no sea compatible es bastante vergonzoso.

Cuestiones relacionadas