2011-02-04 14 views
12

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

+0

Linux jest napisany w C, a nie w C++. g ++ jest frontendem dla C++, użyj gcc dla C. –

+0

g ++ jest kompilatorem C++. Użyj gcc. – bobbogo

+0

Napisaliśmy część jądra Linuksa w C++, więc musimy używać g ++ – Bharat

Odpowiedz

9

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

+1

to już nie jest prawdą w g ++ - 5.2 i prawdopodobnie cofa się przynajmniej do g ++ - 4.8 – Catskul

+1

Cóż, odpowiedź została udzielona w 2012 roku. – Tom

+2

Tak, przepraszam, to było przeznaczone dla czytelników, a nie jako korekta jako taki. – Catskul

-2

Dekodowanie do http://gcc.gnu.org/c99status.html oznaczone inicjatory zostały już zaimplementowane.

Jakiej wersji g ++ używasz? (Spróbuj g ++ - wersja)

+3

To jest C99, a nie C++. Nie sądzę, że każda funkcja C99 jest niejawnie wspierana przez g ++. – Maister

+0

Może nie używasz trybu "C" –

+0

g ++ obsługuje C. Spróbuj g ++ -X c –

12

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}; 
+1

Wyznaczone inicjalizatory nadal nie są częścią żadnej wersji standardowego C++. – Quentin

+0

@Quentin Poprawione teraz. –

1

Od co najmniej g ++ - 4.8 jest to teraz obsługiwane domyślnie.

0

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.

Powiązane problemy