2011-02-04 12 views
12

C'è qualche ragione specifica per cui il supporto per gli inizializzatori designati non è stato aggiunto a g ++? La ragione per cui gli standard C99 sono arrivati ​​tardi e g ++ è stato sviluppato in precedenza e in seguito le persone non si sono preoccupate di questo problema, o c'è qualche difficoltà intrinseca nell'implementare gli inizializzatori designati nella grammatica del C++?Perché gli inizializzatori designati non sono implementati in g ++

+0

Linux è scritto in C e non in C++. g ++ è il frontend per C++, usa gcc per C. –

+0

g ++ è un compilatore C++. Usa gcc. – bobbogo

+0

Abbiamo scritto una parte del kernel di Linux in C++, quindi è essenziale per noi utilizzare g ++ – Bharat

risposta

9

Come ho notato in un commento, G ++ non supporta gli inizializzatori designati C99 standard, ma supporta l'estensione GNU al C90 che consente gli inizializzatori designati. Quindi questo non funziona:

union value_t { 
    char * v_cp; 
    float v_f; 
}; 
union value_t my_val = { .v_f = 3.5f }; 

Ma questo fa:

union value_t my_val = { v_f: 3.5f }; 

Questo sembra essere una cattiva interazione di coordinamento tra le commissioni degli standard C e C++ (non v'è particolarmente buona ragione perché C++ non supporta la sintassi C99, non l'hanno considerato) e la politica GCC (C++ non dovrebbe supportare la sintassi C99 solo perché è in C99, ma dovrebbe supportare la sintassi dell'estensione GNU che ottiene esattamente la stessa cosa perché è un'estensione GNU che può essere applicata a una delle due lingue).

+1

questo non è più vero in g ++ - 5.2 e probabilmente risalire almeno a g ++ - 4.8 – Catskul

+1

Beh, la risposta è stata data nel 2012. – Tom

+2

Sì, scusa, che era inteso come una nota per i lettori piuttosto che una correzione di per sé. – Catskul

-2

Accoding to http://gcc.gnu.org/c99status.html Gli inizializzatori designati sono già stati implementati.

Quale versione di g ++ usi? (Prova g ++ - versione)

+3

Questo è C99, non C++. Non penso che ogni funzione C99 sia implicitamente supportata da g ++. – Maister

+0

Forse non usi la "modalità C" –

+0

g ++ supporta C. Prova g ++ -X c –

12

Mi sono imbattuto in questo stesso problema oggi. g ++ con -std = C++ 11 e C++ 14 supporta gli inizializzatori designati, ma è comunque possibile ottenere un errore di compilazione "test.cxx: 78: 9: sorry, unimplemented: inizializzatori designati non banali non supportati" se non inizializzare la struct nell'ordine in cui sono stati definiti i membri. Ad esempio

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

Gli inizializzatori designati non fanno ancora parte di alcuna versione del C++ standard. – Quentin

+0

@Quentin corretto ora. –

1

A partire da almeno g ++ - 4.8 questo è ora supportato di default.

0

E i sindacati anonimi?

In C posso avere questo:

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

E inizializzato in questo modo:

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) } 
    }; 

Tuttavia sotto g ++ anche con C++ 14 questo dà lo stesso "mi dispiace, non implementata" errore. Dobbiamo essere in grado di definire le variabili C in C++ quando vogliamo almeno un test del codice C con il framework di test C++. Il fatto che una caratteristica così preziosa di C non venga supportata è un vero peccato.

Problemi correlati