Czy istnieje jakiś szczególny powód, dla którego wsparcie dla wyznaczonych inicjalizatorów nie zostało dodane do g ++? Czy powodem było opóźnienie standardów C99, a g ++ zostało opracowane wcześniej, a później ludzie nie przejmowali się tym problemem, czy też istnieje pewna trudność w implementacji wyznaczonych inicjalizatorów w gramatyce C++?Dlaczego wyznaczone inicjalizatory nie są zaimplementowane w g ++
Odpowiedz
Jak napisałem w komentarzu, G ++ nie obsługuje standardowych inicjatorów C99, ale obsługuje rozszerzenie GNU do C90, które pozwala wyznaczonym inicjatorom. Więc to nie działa:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Ale to robi:
union value_t my_val = { v_f: 3.5f };
To wydaje się być złe oddziaływanie koordynacji między ++ komitetów normalizacyjnych C i C (nie jest szczególnie dobry powód dlaczego C++ nie obsługuje składni C99, po prostu tego nie uważali) i polityka GCC (C++ nie powinna obsługiwać składni C99 tylko dlatego, że jest w C99, ale powinna obsługiwać składnię GNU, która osiąga dokładnie to samo, ponieważ jest to rozszerzenie GNU, które można zastosować do każdego z tych języków).
C++ nie obsługuje tego. Nie będzie nawet w standardach C++ 0x, jak się wydaje: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1
Poza tym, dlaczego próbujesz skompilować jądro Linuksa za pomocą G ++?
Napisaliśmy część jądra Linuksa w C++, więc musimy używać g ++ – Bharat
Poczekaj, aż Linus dowie się o tym. –
Dekodowanie do http://gcc.gnu.org/c99status.html oznaczone inicjatory zostały już zaimplementowane.
Jakiej wersji g ++ używasz? (Spróbuj g ++ - wersja)
To jest C99, a nie C++. Nie sądzę, że każda funkcja C99 jest niejawnie wspierana przez g ++. – Maister
Może nie używasz trybu "C" –
g ++ obsługuje C. Spróbuj g ++ -X c –
Wpadłem dziś na ten sam problem. g ++ z -std = C++ 11 i C++ 14 obsługuje wyznaczone inicjalizatory, ale nadal możesz otrzymać błąd kompilacji "test.cxx: 78: 9: przepraszam, niezatwierdzony: nietrywialne oznaczone inicjatory nie są obsługiwane" jeśli nie inicjalizuj struktury w kolejności, w której zdefiniowano jej członków. Jako przykład:
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};
Wyznaczone inicjalizatory nadal nie są częścią żadnej wersji standardowego C++. – Quentin
@Quentin Poprawione teraz. –
Od co najmniej g ++ - 4.8 jest to teraz obsługiwane domyślnie.
Co z anonimowymi związkami zawodowymi?
W C może mam to:
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;
};
};
I zainicjowany tak:
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) }
};
Jednak pod g ++ nawet z C++ 14 daje to ten sam "Przepraszam, ZAIMPLEMENTOWANE" błąd. Musimy umieć definiować zmienne C w C++, gdy chcemy przynajmniej jednostkowego testowania kodu C ze strukturą testową C++. Fakt, że taka cenna funkcja z C nie jest obsługiwana, to wstyd.
- 1. nietrywialne wyznaczone inicjalizatory nieobsługiwane
- 2. Dlaczego metody MonoBehaviour nie są zaimplementowane do nadpisania?
- 3. Dlaczego \ G w SELECT * FROM nazwa_tabeli \ G?
- 4. Dlaczego nie jest (->) zaimplementowane domyślnie w Control.Monad.Instances
- 5. Dlaczego iteratory nie są kopiowalne?
- 6. Dlaczego nie jest w pełni zaimplementowane atomowe podwójne?
- 7. Błąd: "Selektory nie zaimplementowane"
- 8. W jaki sposób zaimplementowane są opcjonalne wartości w Swift?
- 9. W jaki sposób CSS i DOM są zaimplementowane w przeglądarce?
- 10. W jaki sposób automaty skończone są zaimplementowane w kodzie?
- 11. W jaki sposób sygnał i gniazda są zaimplementowane pod maską?
- 12. Jakie są blokady odczytu/zapisu zaimplementowane w pthread?
- 13. Czy inicjalizatory Railsów są wywoływane, gdy uruchamiam konsolę szyn
- 14. Dlaczego ten kod nie kompiluje się w g ++
- 15. Swift: niestandardowe inicjalizatory ViewController
- 16. Odśwież szyn inicjalizatory
- 17. Cluster inicjalizatory z ARC
- 18. Dlaczego w g ++/ld brakuje pamięci?
- 19. Czy typy rekordów F # są zaimplementowane jako struktury lub klasy?
- 20. Co to są te parametry GCC/G ++?
- 21. Dlaczego dopasowanie w Scali zostało zaimplementowane jako słowo kluczowe, a nie jako metoda?
- 22. Dlaczego właściwości nie są deklarowane w interfejsach
- 23. Dlaczego mapy C++ nie są implementowane jako próby?
- 24. Scala foreach i map inicjalizatory
- 25. dlaczego domeny są mieszane w Google Analytics?
- 26. Czy są jakieś detektory, które zostały zaimplementowane na GPU i czy są skalowane/niezmienne?
- 27. Mocowanie wcięcie gdy inicjalizatory obiektów zostały wykorzystane
- 28. Podany element typu nie jest obsługiwany w LINQ do jednostek. Obsługiwane są tylko inicjalizatory, elementy encji i właściwości nawigacji jednostki.
- 29. W jaki sposób ** zostało zaimplementowane w Pythonie?
- 30. marka: g ++: Polecenie nie znaleziono
Linux jest napisany w C, a nie w C++. g ++ jest frontendem dla C++, użyj gcc dla C. –
g ++ jest kompilatorem C++. Użyj gcc. – bobbogo
Napisaliśmy część jądra Linuksa w C++, więc musimy używać g ++ – Bharat