GNU/Linux >> Linux Esercitazione >  >> Linux

Perché gli inizializzatori designati non sono implementati in g++

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 buona per cui il C++ non supporti la sintassi C99, semplicemente non l'hanno presa in considerazione) 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).


Mi sono imbattuto in questo stesso problema oggi. g++ con -std=c++11 e c++14 supporta gli inizializzatori designati, ma puoi comunque ottenere un errore di compilazione "test.cxx:78:9:sorry, unimplemented:inizializzatori designati non banali non supportati" se tu non inizializzare la struttura nell'ordine in cui sono stati definiti i suoi 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};

Linux
  1. Perché Cd non è un programma?

  2. Linux – Perché usiamo Su – e non solo Su?

  3. Perché Nullglob non è predefinito?

  4. Perché `esce &` non funziona?

  5. perché sftp rmdir non funziona?

Perché "cancella" non cancella l'intero schermo?

Perché alcune porte sono segnalate da Nmap filtrate e non le altre?

Perché è Rm -rf e non Rmdir -rf?

I thread sono implementati come processi su Linux?

perché eliminare la cronologia di bash non è sufficiente?

Perché alcuni modelli di CPU della famiglia Intel 6 (Core 2, Pentium M) non sono supportati da intel_idle?