Das das sein?



  • Wenn man folgendes von Borland compilieren läßt,warnt er,das es sich um einen alten Stil der Funktions-Definition handelt,aber läßt es durchgehen,und es scheint auch zu funktionieren:

    #include <iostream.h>
    void foo(int);
    
    void foo(dfg)
    {
    cout<<dfg;
    };
    
    int main(void)
    {
    foo(10);
    return 0;
    };
    

    WANN und WARUM war das erlaubt?Ich habe in einem älteren C-Buch mal nachgesehen,konnte aber keine Beispiele dafür finden.Oder ist das ein Sonderfall,der früher möglich war,so daß der Prototyp einer Funktion ihre Argumenten-Typen bestimmt hat.Das müßte demnach ja vor den Zeiten von Überladenen Funktionen und Co. gewesen sein,denn folgendes wäre ja übel:

    void foo(int);
    void foo(double);
    
    void foo(Zahl)
    {
    //welchen Typ will ich?int oder double?
    }
    

    Kann mir das jemand erklären?
    MFG,
    g_e.



  • hi,

    was warnt er denn genau (bitte buchstabengetreu 😉 )?

    naja im ersten bsp. ist ja klar wie dass gemeint ist, desswegen lässt ers durchgehen. und im zweiten wird er höchstwahrscheinlich einen fehler ausgebn.

    lw



  • Geschichtsstunde. *meld*

    Original erstellt von ghost_error:
    Wenn man folgendes von Borland compilieren läßt,warnt er,das es sich um einen alten Stil der Funktions-Definition handelt,aber läßt es durchgehen,und es scheint auch zu funktionieren:

    In C++ hat es diesen 'alten Stil' niemals gegeben. In C schon.

    Das müßte demnach ja vor den Zeiten von Überladenen Funktionen und Co. gewesen sein

    Was nicht so verwunderlich ist, weil man in C immer noch keine Funktionen überladen kann.

    ,denn folgendes wäre ja übel:

    Nein. Man konnt zu K&R-Zeiten zB einen double so an eine Funktion übergeben:

    gets_a_double(d)
        double d;
    {
         printf("%d\n", d);
    }
    

    Damals galt noch die 'implizit int'-Regel, die besagt hat, dass, wenn der Programmierer in speziellen Kontexten, keinen Typ angibt, ein int verwendet wird. Situationen wo das galt waren (eindeutig erkennbare) Deklarationen ('static a;' bedeutet 'static int a;'), bei Funktionsrückgabewerten (obige Funktion gibt einen 'int' zurück, 'void' gab es noch nicht) und Parametern (deine Funktion spezifiziert verlänge also einen int-Parameter). Auf Dateiebene musste man 'int' auch nicht dazuschreiben, ('a;' ist nämlich außerhalb von Funktionen eindeutig). ZB die C-Referenz (http://cm.bell-labs.com/cm/cs/who/dmr/) weiß da noch etwas mehr.
    Darf ich mich wieder setzten?



  • Ja.

    Hab ich nicht gewusst, weil C "vor meiner Zeit" liegt.

    lw



  • Ah,mille grazie!
    Das war die Antwort nach der ich gesucht habe.
    mit C habe ich mich niemals richtig beschäftigt,aber dann war ja meine Vermutung immerhin schon richtig.
    Vielen Dank.
    g_e.


Anmelden zum Antworten