Domanda

Esiste un motivo specifico per cui il supporto per gli inizializzatori designati non è stato aggiunto a g++?È il motivo per cui gli standard C99 sono arrivati ​​tardi e g++ è stato sviluppato prima e in seguito le persone non si sono preoccupate di questo problema, oppure c'è qualche difficoltà intrinseca nell'implementazione degli inizializzatori designati nella grammatica del C++?

È stato utile?

Soluzione

Come ho notato in un commento, G++ non supporta gli inizializzatori designati standard C99, ma supporta l'estensione GNU a 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 };

Questa sembra essere una cattiva interazione di coordinamento tra i comitati per gli standard C e C++ (non c'è una ragione particolarmente valida per cui il C++ non supporti la sintassi C99, semplicemente non l'hanno considerata) e la politica del GCC (il C++ non dovrebbe (t supporta 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 entrambe le lingue).

Altri suggerimenti

Ho riscontrato questo stesso problema oggi.g++ con -std=c++11 e c++14 supporta gli inizializzatori designati, ma puoi comunque ricevere un errore di compilazione "test.cxx:78:9:scusate, non implementato:inizializzatori designati non banali non supportati" se non si inizializza la struttura nell'ordine in cui sono stati definiti i suoi membri.Come 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};

C++ non lo supporta.A quanto pare non sarà nemmeno negli standard C++0x: http://groups.google.com/group/comp.std.c++/browse_thread/thread/8b7331b0879045ad?pli=1

Inoltre, perché stai provando a compilare il kernel Linux con G++?

Almeno a partire da g++-4.8 questo è ora supportato per impostazione predefinita.

Sarà ufficialmente supportato in C++20, ed è già implementato in g++8.2 (anche senza std=c++2a bandiera).

E le unioni anonime?

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 errore "scusa, non implementato".Dobbiamo essere in grado di definire variabili C in C++ quando vogliamo almeno testare il codice C con il framework di test C++.Il fatto che una funzionalità così preziosa del C non sia supportata è un vero peccato.

Acconsentire ahttp://gcc.gnu.org/c99status.htmlgli inizializzatori designati sono già stati implementati.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top