C'è qualche ragione specifica per cui il supporto per gli inizializzatori designati non è stato aggiunto a g ++? La ragione per cui gli standard C99 sono arrivati tardi e g ++ è stato sviluppato in precedenza e in seguito le persone non si sono preoccupate di questo problema, o c'è qualche difficoltà intrinseca nell'implementare gli inizializzatori designati nella grammatica del C++?Perché gli inizializzatori designati non sono implementati in g ++
risposta
Come ho notato in un commento, G ++ non supporta gli inizializzatori designati C99 standard, ma supporta l'estensione GNU al 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 };
Questo sembra essere una cattiva interazione di coordinamento tra le commissioni degli standard C e C++ (non v'è particolarmente buona ragione perché C++ non supporta la sintassi C99, non l'hanno considerato) e la politica GCC (C++ non dovrebbe supportare 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 una delle due lingue).
C++ non supporta questo. Sembra che non sia nemmeno nello 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 ++?
Abbiamo scritto una parte del kernel di Linux in C++, quindi è essenziale per noi utilizzare g ++ – Bharat
Attendere fino a quando Linus lo saprà. –
Accoding to http://gcc.gnu.org/c99status.html Gli inizializzatori designati sono già stati implementati.
Quale versione di g ++ usi? (Prova g ++ - versione)
Questo è C99, non C++. Non penso che ogni funzione C99 sia implicitamente supportata da g ++. – Maister
Forse non usi la "modalità C" –
g ++ supporta C. Prova g ++ -X c –
Mi sono imbattuto in questo stesso problema oggi. g ++ con -std = C++ 11 e C++ 14 supporta gli inizializzatori designati, ma è comunque possibile ottenere un errore di compilazione "test.cxx: 78: 9: sorry, unimplemented: inizializzatori designati non banali non supportati" se non inizializzare la struct nell'ordine in cui sono stati definiti i membri. Ad 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};
Gli inizializzatori designati non fanno ancora parte di alcuna versione del C++ standard. – Quentin
@Quentin corretto ora. –
A partire da almeno g ++ - 4.8 questo è ora supportato di default.
E i sindacati anonimi?
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 "mi dispiace, non implementata" errore. Dobbiamo essere in grado di definire le variabili C in C++ quando vogliamo almeno un test del codice C con il framework di test C++. Il fatto che una caratteristica così preziosa di C non venga supportata è un vero peccato.
- 1. inizializzatori designati e gli elementi omessi
- 2. Perché non possiamo aggiungere inizializzatori designati nelle estensioni in swift?
- 3. equivalenti in C++ agli inizializzatori designati?
- 4. Perché non sono consentiti gli inizializzatori di raccolta su riassegnazioni?
- 5. Perché i metodi MonoBehaviour non sono implementati per l'override?
- 6. Posso usare segues con gli inizializzatori designati dei controller di visualizzazione?
- 7. Gli inizializzatori da tipi generici non saranno ereditati in swift?
- 8. Gli inizializzatori di istanza sono considerati in cattivo stile?
- 9. Gli algoritmi java sono implementati in C o in java?
- 10. Perché gli elenchi di inizializzatori non sono disponibili quando si modifica l'allocatore di std :: vector?
- 11. Perché sono autorizzato a modificare le proprietà che sono di sola lettura con gli inizializzatori dell'oggetto?
- 12. Perché AsObservable e AsEnumerable sono implementati in modo diverso?
- 13. Perché gli inizializzatori in classe possono utilizzare solo = o {}?
- 14. Gli array javascript sono effettivamente implementati come array?
- 15. In C#, come interagiscono gli inizializzatori di campo e gli inizializzatori di oggetti?
- 16. Perché utilizzare argomenti variadici ora quando sono disponibili gli elenchi di inizializzatori?
- 17. Perché \ G in SELECT * FROM nome_tabella \ G?
- 18. Come vengono implementati gli array in Perl?
- 19. Perché utilizzare gli inizializzatori richiesti nelle classi Swift?
- 20. Perché gli inizializzatori di campo di una classe derivata vengono eseguiti prima che gli inizializzatori delle classi base
- 21. Gli elementi ListView non sono selezionabili. perché?
- 22. Perché gli array non sono espandibili?
- 23. Cosa restituiscono gli inizializzatori di array?
- 24. Trasmetti gli inizializzatori a un puntatore
- 25. Perché gli operatori di assegnazione non sono sovraccaricabili in VB.NET?
- 26. Perché gli array 0d in Numpy non sono considerati scalari?
- 27. Come sono implementati i flussi pigri in Java 8?
- 28. Perché gli interi sono immutabili in Python?
- 29. Errore: "Selettori non implementati"
- 30. Come sono stati implementati "diecimila centesimi"?
Linux è scritto in C e non in C++. g ++ è il frontend per C++, usa gcc per C. –
g ++ è un compilatore C++. Usa gcc. – bobbogo
Abbiamo scritto una parte del kernel di Linux in C++, quindi è essenziale per noi utilizzare g ++ – Bharat