gcc ab 3.4



  • Ich kompiliere mit gcc. Ist ein reiner C-Code



  • ein demobeispiel waere nett.



  • Ok, ich versuche es ein Bsp. zu geben:

    test.h:
    s_trg m_sin();

    test.c:
    s_trg m_sin();

    test3.h
    s_trg m_sin(double sin);

    ich binde mehrere include-Files ein, wobei ein Include den vollen Prototypen enthält. Bis gcc-3.36 war das kein Problem, jetzt will er in den test-Dateien den vollen Prototypen sehen (also s_trg(double sin)). Ich sehe nicht lt. Changelog von Gnu den Fehler.



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Compiler-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also dass hier frisst mein 3.4 anstandslos:

    //test.h
    #ifndef TEST_H
    #define TEST_H
    
    extern void sayHello();
    
    #endif // TEST_H
    
    //test.c
    #include "test.h"
    #include <stdio.h>
    
    void sayHello() {
      puts("Hello World");
    };
    
    //main.c
    #include "test.h"
    
    int main(int argc, char **argv) {
      sayHello();
      return 0;
    };
    

    Würde ich jetzt aber noch eine weitere Header Datei (test2.h) in main einbinden, mit folgender Funktion:

    #ifndef TEST_2_H
    #define TEST_2_H
    #include <stdio.h>
    
    void sayHello(char *name) {
      printf("Hello World to %s", name);
    };
    

    Dann würde ich ja sayHello überladen, das kann C nicht! Sonst kann ich mir den Fehler nicht erklären.



  • hjdt schrieb:

    Ich kompiliere mit gcc. Ist ein reiner C-Code

    C kennt keine Funktionsüberladung.



  • kingruedi schrieb:

    hjdt schrieb:

    Ich kompiliere mit gcc. Ist ein reiner C-Code

    C kennt keine Funktionsüberladung.

    Das ist richtig! Wenn ich aber folgendes angebe
    test.h:
    void fl();

    test.c:
    #include <test.h>
    extern void fl();

    test2.h:
    extern void fl(int a);

    dann habe ich die Funktion nicht überlagert, denn nicht vollständig ausgeprägte Funktionsköpfe sind erlaubt.



  • hjdt schrieb:

    dann habe ich die Funktion nicht überlagert, denn nicht vollständig ausgeprägte Funktionsköpfe sind erlaubt.

    Das ist falsch, denn du überladst die Methode fl, genauer gesagt überlädst du sie, indem du andere Parameter angibst!

    Bsp. in C++ (in C geht das nicht):

    //Überladene "fun"-Methoden, Unterscheidung anhand der Parameterliste, return-Wert ginge auch
    void fun();
    void fun(int);
    void fun(int, int);
    

    Überlagern (auch bekannt als überschatten) ist was anderes:

    //globaler namensraum
    int x;
    
    void fun() {
      int x;  //jetzt überschattet das lokale x das globale x
      x = 7;  //Zuweisung lokales x 
      ::x = 5;  //Zuweisung globales x, sieht das beschissen aus
    };
    


  • Wie es auch sei. Aber warum ging es vor der Version 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