GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum sind designierte Initialisierer nicht in g++ implementiert

Wie ich in einem Kommentar angemerkt habe, unterstützt G++ keine vom C99-Standard designierten Initialisierer, aber es unterstützt die GNU-Erweiterung von C90, die designierte Initialisierer zulässt. Das funktioniert also nicht:

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

Aber das tut:

union value_t my_val = { v_f: 3.5f };

Dies scheint ein schlechtes Zusammenspiel zwischen der Koordination zwischen den C- und C++-Standardkomitees (es gibt keinen besonders guten Grund, warum C++ die C99-Syntax nicht unterstützt, sie haben es nur nicht berücksichtigt) und der GCC-Politik (C++ sollte nicht Die C99-Syntax wird nicht unterstützt, nur weil sie in C99 enthalten ist, aber sie sollte die GNU-Erweiterungssyntax unterstützen, die genau dasselbe erreicht, weil dies eine GNU-Erweiterung ist, die auf beide Sprachen angewendet werden kann).


Ich bin heute auf dasselbe Problem gestoßen. g++ mit -std=c++11 und c++14 unterstützt bestimmte Initialisierer, aber Sie können trotzdem einen Kompilierungsfehler „test.cxx:78:9:Entschuldigung, nicht implementiert:nicht-triviale bestimmte Initialisierer werden nicht unterstützt“ erhalten, wenn Sie dies tun Initialisieren Sie die Struktur nicht in der Reihenfolge, in der ihre Mitglieder definiert wurden. Als Beispiel

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. Warum sind harte Links zu Verzeichnissen in Unix/Linux nicht erlaubt?

  2. Warum eine lange Verzögerung, nachdem der Befehl nicht gefunden wurde?

  3. Warum sind Netzwerkschnittstellen nicht wie andere Geräte in /dev?

  4. Linux – Warum funktioniert Setuid nicht?

  5. Warum funktioniert `exit &` nicht?

Warum ist Cd kein Programm?

Warum „löschen“ den ganzen Bildschirm nicht löschen?

Warum verwenden wir su - und nicht nur su?

Sind Threads als Prozesse unter Linux implementiert?

Warum reicht das Löschen des Bash-Verlaufs nicht aus?

Warum werden einige CPU-Modelle der Intel-Familie 6 (Core 2, Pentium M) nicht von intel_idle unterstützt?