Ho un array di (puntatori a) array di lunghezze differenti, che appresi potuto definire usando letterali composti:Clang lamenta: "puntatore viene inizializzato da un array temporaneo"
const uint8_t *const minutes[] = {
(const uint8_t[]) {END},
(const uint8_t[]) {1, 2, 3, 4, 5 END},
(const uint8_t[]) {8, 9, END},
(const uint8_t[]) {10, 11, 12, END},
...
};
gcc accetta questo solo bene, ma clang dice: pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression
. Cosa significa questo? Il codice sembra funzionare, ma poi ancora un sacco di cose sembrano funzionare quando puntano alla memoria che non è più assegnata. È qualcosa di cui ho bisogno di preoccuparmi? (In definitiva ho solo bisogno di lavorare con gcc.)
Aggiornamento: Sta succedendo qualcosa di strano. Si dice che here:
codiceCompound literals yield lvalues. This means that you can take the address of a compound literal, which is the address of the unnamed object declared by the compound literal. As long as the compound literal does not have a const-qualified type, you can use the pointer to modify it.
`struct POINT *p; p = &(struct POINT) {1, 1};
Questo esempio sembra fare esattamente quello che sto cercando di fare: un puntatore a qualcosa di definito da un composto letterale. Quindi il messaggio di errore clang è legittimo? Questo finirà per indicare la memoria non allocata quando compilata con clang o gcc?
Aggiornamento 2: Trovato alcuni documentation: "In C, un letterale composto designa un oggetto senza nome con durata di conservazione statica o automatica In C++, un composto letterale designa un oggetto temporaneo, che vive solo fino alla fine. della sua piena espressione "Quindi sembra che clang abbia ragione ad avvisare di questo, e probabilmente anche gcc dovrebbe, ma non lo fa, anche con -Wall -Wextra
.
Non riesco a indovinare perché una funzionalità C utile è stata rimossa dal C++ e non è stato fornito alcun modo alternativo elegante per realizzare la stessa cosa.
Stai compila con '-W' flag quando si utilizza gcc?Potrebbe apparire se non sei – GeoffreyB
Sì. -Wall -Wextra, che è apparentemente la stessa cosa. – Josh
hai provato a rimuovere l'inutile '(const uint8_t [])' all'inizio di ogni riga? –