¿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 ++
Respuesta
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).
C++ no es compatible con esto. Ni siquiera estará en los estándares de C++ 0x: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1
Además, ¿por qué intentas compilar el kernel de Linux con G ++?
Hemos reescrito alguna parte del núcleo de Linux en C++, por lo que es esencial para nosotros usar g ++ – Bharat
Espere a que Linus lo oiga. –
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 ++)
Eso es C99, no C++. No creo que todas las características de C99 sean respaldadas implícitamente por g ++. – Maister
Quizás no utilice el "modo C" –
g ++ admite C. Pruebe g ++ -X c –
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};
Los inicializadores designados aún no forman parte de ninguna versión de C++ estándar. – Quentin
@Quentin Corregido ahora. –
Al menos desde g ++ - 4.8 ahora es compatible de forma predeterminada.
¿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.
- 1. C++ Equivalente a los inicializadores designados?
- 2. inicializadores designados y elementos omitidos
- 3. ¿Combinar inicializadores designados y malloc en C99 +?
- 4. ¿Por qué molestarse con los inicializadores? (.net)
- 5. ¿Por qué los inicializadores de Railtie no se ejecutan?
- 6. ¿Puedo usar segues con los inicializadores designados de los controladores de visualización?
- 7. ¿Por qué los inicializadores de matrices solo están permitidos para matrices?
- 8. ¿Por qué C++ no admite varios inicializadores en for loop?
- 9. Interrumpe en C/C++ ??? ¿Cómo están implementados/codificados?
- 10. Memcache + PHP - ¿Por qué los datos no están expirando?
- 11. ¿Qué determina el proceso por el cual se resuelven los métodos no implementados?
- 12. ¿Por qué los elementos de Stellar.js no se están moviendo?
- 13. ¿Por qué los OODBMS no están tan extendidos como RDBMS?
- 14. ¿Por qué \ G en SELECT * FROM table_name \ G?
- 15. ¿Por qué están prohibidos los comentarios anidados?
- 16. ¿Por qué no se permiten los inicializadores de recopilación en reasignaciones?
- 17. ¿Por qué no puedes usar 'esto' en los inicializadores de miembros?
- 18. ¿Por qué este código no se compila en g ++
- 19. ¿Los algoritmos de Java están implementados en C o en Java?
- 20. Rieles: ¿Inicializadores por entorno?
- 21. ¿Qué lenguajes de programación tienen los intérpretes implementados más fácilmente?
- 22. ¿Por qué no hay advertencia de gcc/g ++ para los temporales no utilizados?
- 23. ¿Por qué mis propiedades públicas no están serializadas por XmlSerializer?
- 24. ¿Por qué los eventos y comandos en MVVM no están soportados por WPF/Visual Studio?
- 25. ¿Con qué frecuencia se ejecutan los inicializadores en Rails?
- 26. ¿Por qué no se usan los paquetes de erlang?
- 27. ¿Por qué los enlaces duros no están permitidos en los directorios de UNIX/Linux
- 28. ¿Por qué los glifos no se alinean si están en los mismos gráficos?
- 29. ¿Por qué las estructuras estáticas no están permitidas en C#?
- 30. ¿Por qué las clases no están selladas por defecto?
Linux está escrito en C y no en C++. g ++ es la interfaz para C++, use gcc para C. –
g ++ es un compilador de C++. Use gcc. – bobbogo
Hemos reescrito alguna parte del kernel de Linux en C++, por lo que es esencial para nosotros usar g ++ – Bharat