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.
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