Übergabeparameter ohne Name?!?!



  • Hallo Allesamt,

    bin gerade etwas verwirrt... habe hier auf Arbeit einen Stück Code gefunden, der in entwa so aussieht:

    void Foo(void*)     // Nur Typ? Bei einer Definition?
    {
         // [...]
    }
    
    void Bar()
    {
         // [...]
         Foo(&SomeLocal);
         // [...]
    }
    

    Intern sind die Funktionen recht aufgebläht, und da ich gerade keine Zeit habe mich komplett durchzuwühlen und nach dem Sinn zu suchen, frag' ich einfach mal nach: Was zum Teufel macht es für einen Sinn, einen Parameter zu erwarten, der keinen Namen hat? Liegt dann auf dem Stack, super, aber was genau mach ich dann damit, wenn ich ihn nicht (de-)referenzieren kann? 😕

    Keine Ahnung ob das totale Basics sind die ich verpasst habe, aber ich hab' sowas ja noch nie gesehen... kann mir da jemand vom Schlauch runter helfen? Wäre super!

    Gruß
    PuerNoctis


  • Administrator

    Bei der Deklaration von Funktionen macht man dies zum Teil, wenn ich persönlich dies auch als schlechter Stil ansehe. Also:

    // Deklaration:
    void foo(int, double, char, float, void*);
    
    // Definition:
    void foo(int myint, double mydouble, char mychar, float myfloat, void* data)
    {
      // ...
    }
    

    Wieso man dies bei einer Definition auch machen sollte, leuchtet mir aber nicht wirklich ein. Ausser sie packen ihre hardcore Hackerkenntnisse aus und greifen dann per Assembler darauf zu ... aber das wäre dann meiner Meinung nach SEEEEHR EXTREM SCHLECHTER STIL :p

    Das einzige was ich mir vielleicht auch noch vorstellen könnte, dass es irgendeine Art von Rückwärtskompatibilität darstellt. Früher wurde der Parameter benötigt und später dann gestrichen, damit die Schnittstelle aber nicht verändert wird, wurde der Parameter dort belassen. Müsste dann aber irgendwo in der Dokumentation dazu stehen und gibt normalerweise bessere Möglichkeiten dies zu bewerkstelligen 😉

    Grüssli



  • Der Parameter kann dann nicht benutzt werden, wird also höchstwahrscheinlich auch gar nicht gebraucht. Man lässt den Bezeichner weg, damit es keine Warnung wegen unbenutzten Variablen gibt.
    Das kann Sinn ergeben, wenn die Funktion eine Schnittstelle erfüllen muss, in der dieser Parameter vorkommen, weil es sich entweder um eine API handelt und man nicht an alle Aufrufer herankommt, oder wenn es eine virtuelle Funktion ist, die eine andere überschreibt.
    Auch für bestimmte Tricksereien im Zusammenhang mit Überladungsauflösung wird sowas benutzt.


  • Mod

    Bashar schrieb:

    Auch für bestimmte Tricksereien im Zusammenhang mit Überladungsauflösung wird sowas benutzt.

    Ist ja sogar Teil des Standards bei den Operatoren ++ und --.



  • Ah, okay, danke Euch allen. Das mit der Schnittstellengeschichte und Kompatibilität kann gut sein -- der Code ist gute 15 Jahre alt.



  • @Bashar und SeppJ: Könnt Ihr mir dazu vlt noch irgendwas erklären oder Links bereitstellen (oder zumindest, nach was genau man da googlet?)? Das hört sich ja recht interessant an, und ich erweitere meinen Horizont gerne 😉

    Nur wenn's aber keine Umstände macht 😉



  • Manchmal übergibt man auch "dummys" in C++, nur, damit die richtige Funktion ausgewählt wird. Die brauchen dann auch keine Namen, weil man sie in der Funktion nicht benutzt. Siehe tag dispatching.

    Und sonst, ja, der Name eines Parameters ist optional. Man kann ihn nur ohne Namen schlecht benutzen. Der Name eines Parameters ist auch nicht Teil des Funktionstyps.


Anmelden zum Antworten