gcc ab 3.4



  • hjdt schrieb:

    Wie es auch sei. Aber warum ging es vor der Version 3.4?

    Keine Ahnung, kann mir das eigentlich auch nicht erklären, denn C konnte noch nie überladen, und wird's wohl auch nie können. *Schulterzuck*
    Hast du die gcc 3.3.4 noch drauf? Sonst probier mal Code aus meinem zweiten Post aus, ob der funktioniert. Ich denke eher nicht.



  • Der Code von Dir kann mit einem C-Conpiler nicht funktionieren, wegen dem Skope ::. Ersetze ich die globale Variable x durch xx, funktioniert der
    Übersetzungsvorgang einwandfrei.

    Folgendes zu den leeren Prototypen:
    In K&R C gibt es diese leeren Prototypen. Erst im C89-Standard wurde dies abgeschafft. Ich habe im Changelog zum gcc-3.4 gefunden, das dieser einen C89-Compiler zur Übersetzung benötigt. Für mich bedeutet das, dass eben die K&R-Prototypen nicht mehr erlaubt sind. Wäre doch eine Erklärung oder?



  • hjdt schrieb:

    Der Code von Dir kann mit einem C-Conpiler nicht funktionieren, wegen dem Skope ::. Ersetze ich die globale Variable x durch xx, funktioniert der
    Übersetzungsvorgang einwandfrei.

    Schon klar, dass meinte ich auch nicht, ich meinte dass die Überladen-Geschichte mit der gcc 3.3.4 auch nicht fuktionieren darf.

    Folgendes zu den leeren Prototypen:
    In K&R C gibt es diese leeren Prototypen. Erst im C89-Standard wurde dies abgeschafft. Ich habe im Changelog zum gcc-3.4 gefunden, das dieser einen C89-Compiler zur Übersetzung benötigt. Für mich bedeutet das, dass eben die K&R-Prototypen nicht mehr erlaubt sind. Wäre doch eine Erklärung oder?

    Hm, so wie ich das sehe, haben wir momentan keine bessere Erklärung.



  • Nabend,

    koennte evtl. auch eine gcc-Erweiterung gewesen sein, die ab 3.4 nicht mehr
    vorhanden ist? Nur so ein Gedanke.

    mfg
    v R



  • virtuell Realisticer schrieb:

    koennte evtl. auch eine gcc-Erweiterung gewesen sein, die ab 3.4 nicht mehr
    vorhanden ist?

    An welche hast Du da gedacht?



  • hjdt schrieb:

    virtuell Realisticer schrieb:

    koennte evtl. auch eine gcc-Erweiterung gewesen sein, die ab 3.4 nicht mehr
    vorhanden ist?

    An welche hast Du da gedacht?

    Er dachte an die Möglichkeit, dass der gcc Überladen von Funktionen in C ermöglichte. Da dies aber im Standard nicht definiert ist, wäre es eine compilerspezifische Erweiterung.



  • Der gcc hat nie Überladungen von C-Funktionen ermöglicht! Was hier funktioniert hat und nicht mehr funktioniert ist eine Antiquität aus K&R-Zeiten, die die meisten hier wohl nicht mehr im Kopf zu haben scheinen :):

    extern void test();
    

    war eine gültige(!!) Forward-Deklaration von

    void test(int a, char b) { ... }
    

    Das heisst schlicht und ergreifend dass ab GCC 3.4 der Ausdruck "void test()" dem Ausdruck "void test(void)" zu 100% entspricht, was vorher nicht der Fall war. Vorher konnte der Ausdruck "void test()" ein Prototyp ohne definierte Parameterliste (was nicht heisst dass die Parameterliste leer sein musste) sowie eine Definition "void test(void)" sein.

    Was uns zu dem Schluß bringt, dass in ISO C keine nicht vollständig ausgeprägten Parameterlisten mehr erlaubt sind, und der GCC 3.4 dies erstmals auch beachtet.



  • Aha, da liegt der Hund begraben, das ist aber ne ziemliche Unzulänglichkeit vom gcc < 3.4



  • Nicht nur von dem 😃

    Wir portieren hier grad ziemlich viel Code von alten HP-UX Maschinen (z.T. wirklich noch aus K&R-Zeiten), und dabei fällt erstmal auf wieviele Warnungen die ollen HP-(ANSI-)Compiler noch verschweigen, die schon der 2.95er GCC bemängeln würde 🙂



  • K&R C ist aber auch ziemlich übles Zeug 😉


Anmelden zum Antworten