Mam tablicę (wskaźniki do) tablic o różnych długościach, które nauczyłem mogłem zdefiniować za pomocą literałów złożonych:Clang narzeka: „wskaźnik jest inicjowany przez tablicy tymczasowej”
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 akceptuje tę właśnie dobrze, ale clang mówi: pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression
. Co to znaczy? Kod wydaje się być do pracy, ale znowu, wiele rzeczy wydaje się do pracy, gdy wskazują na pamięć, która nie jest już przydzielona. Czy jest to coś, o co muszę się martwić? (Ostatecznie naprawdę potrzebuję go tylko do pracy z gcc.)
Aktualizacja: Coś podejrzanego dzieje się. Mówi here że:
Compound 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};
Ten przykładowy kod wydaje się, że robi dokładnie to, co usiłuję zrobić: wskaźnik do czegoś zdefiniowanej przez związek dosłownym. Czy komunikat o błędzie klang jest wiarygodny? Czy to wskaże na nieprzydzieloną pamięć po kompilacji z klangiem lub gcc?
Aktualizacja 2: Znaleziono niektóre documentation: „W C dosłownym związek wyznacza anonimowego obiektu ze statycznym lub automatycznym czas przechowywania W C++, związek dosłowne oznacza tymczasowy obiekt, który tylko żyje aż do końca. jego pełnego wyrażenia "Tak więc wydaje się, że klang ma rację, ostrzegając o tym, a gcc prawdopodobnie również powinien, ale nie, nawet z -Wall -Wextra
.
Nie mogę zgadnąć, dlaczego użyta funkcja C została usunięta z języka C++ i nie podano eleganckiego alternatywnego sposobu osiągnięcia tego samego.
Czy kompilacji z Flaga '-W' przy użyciu gcc?Może się pojawić, jeśli nie jesteś – GeoffreyB
Tak. -Wall -Wextra, która jest podobno tą samą rzeczą. – Josh
próbowałeś usunąć niepotrzebne '(const uint8_t [])' na początku każdego wiersza? –