Code kompiliert in C aber nicht in C++



  • Guten Abend!

    Unten angehängter Code kompiliert ohne Warnungen mit clang im C Modus. Mit Clang++ im C++ Modus gibt es jedoch den folgenden Fehler:

    test.cpp:17:9: error: initializer element is not a compile-time constant                                                                                      
            (const struct bar*[]) {                                                                                                                               
            ^~~~~~~~~~~~~~~~~~~~~~~
    

    Warum ist das so? Und kann ich den Code irgendwie ändern, dass er auch mit Clang++ kompiliert ohne die Definitionen der structs zu ändern? (Diese sind von einer C Library vorgegeben.)

    #include  <stdio.h>
    
    struct foo {
      const struct bar **asdf;
    };
    
    struct bar {
      int i;
      const struct foo *asdf;
    };
    
    const struct bar baz =
      {
        42,
        (const struct foo[]) {
          {
            (const struct bar*[]) {
              &baz,
              &baz,
            },
          },
        }
      };
    
    int main()
    {
      printf("%i\n", baz.asdf[0].asdf[0]->i);
      return 0;
    }
    

  • Mod

    Das würde größeres Gefrickel werden, sofern es überhaupt möglich ist, dies 100% umzusetzen. Einfacher wäre es wahrscheinlich, wenn du sagen würdest, welche Teile unbedingt so bleiben müssen wie bisher und warum, und bei welchen Teilen du flexibel bist.

    Aber der wahre Tipp: Wenn du C mit einem C++-Compiler compilierst, dann machst du etwas falsch. Fundamental. Wirklich. Egal ob dir irgendjemand mal erzählt hat, dass C eine Untermenge von C++ wäre. Ist einfach nicht so. Dein Vorhaben wäre ungefähr so, als würdest du ein Java-Programm mit einem C++-Compiler übersetzen wollen. Das käme dir sicher wie eine lächerliche Idee vor. Bloß weil bei 'C' und 'C++' ähnliche Buchstaben im Namen stecken, wird dieses Vorhaben aber nicht besser als bei 'C++' und 'Java'.

    Daher ist die richtige Antwort eine Gegenfrage: Wieso denkst du, ein C-Programm mit C++ übersetzen zu müssen? Es gibt garantiert eine bessere Lösung.


  • Mod

    extern const struct bar baz;
    const struct bar* baz_1[] = {&baz, &baz};
    const struct foo baz_2 = {baz_1};
    const struct bar baz =
      {
        42,
        &baz_2
      };
    


  • camper schrieb:

    extern const struct bar baz;
    const struct bar* baz_1[] = {&baz, &baz};
    const struct foo baz_2 = {baz_1};
    const struct bar baz =
      {
        42,
        &baz_2
      };
    

    Danke! 🙂


Log in to reply