komische funktionsaufrufe



  • Hi Leute,
    ich hab da mal einen allgemeine Frage:

    habe hier einen source bei dem der funktionsaufruf etwas komisch ist,
    kann mir jemand von euch sagen was hier genau passiert?:

    ---snip---
    sys_select(p, v, retval)
    register struct proc *p;
    void *v;
    register_t *retval;
    {
    ...
    ---snap---

    oder handelt es sich hier überhaupt um ne Funktion?

    gruß Hermann



  • Es ist kein Funktionsaufruf, sondern eine Deklaration.
    Die Parameter werden unterhalb des Headers definiert. register bedeutet dass die Variable nach möglichkeit in einem CPU-Register abgelegt werden sollte. Da kein Rückgabetyp dabei steht gibt die funktion standardmäßig einen integer zurück. Ich weiß nicht genau wie dieser Schreibstil heißt, glaube das ist der von Kernigan und Ritchie.



  • handelt sich um eine Funktionsdefinition, nach altem K&R C

    in heutigem C (C99) würde man das so machen

    int sys_select(register struct proc *p,void *v,register_t *retval) {
     //...
    }
    


  • müsste aber schon eine funktion sein, da innerhalb der geschweiften klammer schon auch instruktionen stehen...

    aber auf jeden fall mal danke! das hilft mir sehr weiter 😉



  • kingruedi schrieb:

    handelt sich um eine Funktionsdefinition, nach altem K&R C

    in heutigem C (C99) würde man das so machen...

    Bereits mit C89 wurden zuverlässige Prototypen eingeführt. Nur als kleine Anmerkung. Damit kann der Compiler überprüfen, ob passende Typen beim Funktionsaufruf verwendet wurden. Bei obiger Definition kann er das nicht.



  • jetzt muss ich aber doch nochaml weiterfragen:

    der code geht wie follgt weiter:

    sys_select(p, v, retval)
      register struct proc *p;
      void *v;
      register_t *retval;
    {
      register struct sys_select_args /* {
        syscallarg(int) nd;
        syscallarg(fd_set *) in;
        syscallarg(fd_set *) ou;
        syscallarg(fd_set *) ex;
        syscallarg(struct timeval *) tv;
      } */ *uap = v;
    
      ...
    

    die elemente der struktur sys_select_args sind mir auch noch suspekt...
    kann mir da vielleicht auch noch jemand auf die sprünge helfen ?

    thx
    mfg Hermann



  • Was register bedeutet habe ich schon oben beschrieben. syscallarg() ist irgendein Makro. Durchsuche einfach alle includes (also alle .h) nach "#define syscallarg", dann findest Du vielleicht die Bedeutung.



  • Hermann_na schrieb:

    jetzt muss ich aber doch nochaml weiterfragen:
    ....
    die elemente der struktur sys_select_args sind mir auch noch suspekt...
    kann mir da vielleicht auch noch jemand auf die sprünge helfen ? ...

    Hmmm .... hier musst Du in deiner Doku nachlesen welche Bedeutung jedes einzelne Element hat.



  • passt, es ist ein macro

    also nochmal vielen dank, ihr habt mir sehr weitergeholfen 😉

    mfg Hermann



  • der Code scheint glaub ich dringend eine Renovierung nötig zu haben 😉

    naja, register wird von den heutigen Compilern AFAIK eh ignoriert, genauso wie inline. Die Compiler sind im optimieren ja eh viel kleverer, als der Programmierer


Anmelden zum Antworten