Perché gli inizializzatori designati non sono implementati in g++
-
29-10-2019 - |
Domanda
Esiste un motivo specifico per cui il supporto per gli inizializzatori designati non è stato aggiunto a g++?È il motivo per cui gli standard C99 sono arrivati tardi e g++ è stato sviluppato prima e in seguito le persone non si sono preoccupate di questo problema, oppure c'è qualche difficoltà intrinseca nell'implementazione degli inizializzatori designati nella grammatica del C++?
Soluzione
Come ho notato in un commento, G++ non supporta gli inizializzatori designati standard C99, ma supporta l'estensione GNU a C90 che consente gli inizializzatori designati.Quindi questo non funziona:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Ma questo fa:
union value_t my_val = { v_f: 3.5f };
Questa sembra essere una cattiva interazione di coordinamento tra i comitati per gli standard C e C++ (non c'è una ragione particolarmente valida per cui il C++ non supporti la sintassi C99, semplicemente non l'hanno considerata) e la politica del GCC (il C++ non dovrebbe (t supporta la sintassi C99 solo perché è in C99, ma dovrebbe supportare la sintassi dell'estensione GNU che ottiene esattamente la stessa cosa perché è un'estensione GNU che può essere applicata a entrambe le lingue).
Altri suggerimenti
Ho riscontrato questo stesso problema oggi.g++ con -std=c++11 e c++14 supporta gli inizializzatori designati, ma puoi comunque ricevere un errore di compilazione "test.cxx:78:9:scusate, non implementato:inizializzatori designati non banali non supportati" se non si inizializza la struttura nell'ordine in cui sono stati definiti i suoi membri.Come esempio
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++ non lo supporta.A quanto pare non sarà nemmeno negli standard C++0x: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1
Inoltre, perché stai provando a compilare il kernel Linux con G++?
Almeno a partire da g++-4.8 questo è ora supportato per impostazione predefinita.
Sarà ufficialmente supportato in C++20, ed è già implementato in g++8.2 (anche senza std=c++2a
bandiera).
E le unioni anonime?
In C posso avere questo:
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 inizializzato in questo modo:
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) }
};
Tuttavia sotto g++ anche con c++14 questo dà lo stesso errore "scusa, non implementato".Dobbiamo essere in grado di definire variabili C in C++ quando vogliamo almeno testare il codice C con il framework di test C++.Il fatto che una funzionalità così preziosa del C non sia supportata è un vero peccato.
Acconsentire ahttp://gcc.gnu.org/c99status.htmlgli inizializzatori designati sono già stati implementati.
Che versione di g++ usi?(Prova g++ -- versione)