cuserid( ... )



  • Hallo,

    ich möchte fragen welche Wirkung hat folgende Zeile

    char* cuserid( ... );
    

    in einer Header Datei?

    Danke


  • Mod

    Das deklariert eine Funktion namens cuserid, die einen Wert vom Typ char* zurück gibt und eine beliebige Anzahl an unbekannten Argumenten entgegen nimmt (sogenannte Ellipse). In C wäre es gar nicht erlaubt, dass die Funktion gar keinen anderen Parameter annimmt (also z.B. char* cuserid(int parameter, ...); ). In C++ ist es streng genommen erlaubt, aber in der Regel nicht sehr nützlich. Überhaupt ist die Benutzung von Ellipsen in C++ total überflüssig und unsicher. Es gibt andere Techniken, die sowohl einfacher zu programmieren als auch wesentlich weniger fehleranfällig wären. Die Rückgabe eines Zeigers auf einen veränderlichen(!) char ist ebenfalls höchst verdächtig.

    edit: Ahh, das ist ein (veralteter!) Unix-Systemaufruf, bei dem in der Anleitung nochmals ausdrücklich beschrieben wird, wie mit dem Rückgabewert umzugehen ist. Da sollte aber eigentlich ein char* als Argument stehen, keine Ellipse. Wie schon gesagt, das ist in C eigentlich ungültig und hier liegt eindeutig C vor, daher das komische Interface mit den char*.



  • Das ist eine Funktionsdeklaration, die besagt, dass es eine Funktion cuserid gibt, die beliebige Parameter entgegennimmt und einen Zeiger auf einen char zurückgibt.



  • wie spricht man denn dann innerhalb der funktion die parameter an?


  • Mod

    anti-freak schrieb:

    wie spricht man denn dann innerhalb der funktion die parameter an?

    Mit den Ellipsenfunktionen der C-Bibliothek:
    http://www.cplusplus.com/reference/clibrary/cstdarg/

    Aber: Mach das nicht! In C++ ist das immer falsch. Du untergräbst damit ohne jede Not das Typensystem, das dich sonst vor Dummheiten bewahrt! 30 % aller Beiträge im C Forum sind auf falsche Typen bei scanf/printf (die mit Ellipsen arbeiten) zurück zu führen, bei denen der Compiler aufgrund der fehlenden Typinformation die Fehler nicht finden kann*.

    *: Ja, ich weiß, dass der GCC diese Fehler doch finden kann, wenn man sich an bestimmte Konventionen hält. Aber er darf nur warnen, da es kein "richtiger" Fehler im Sinne der Sprache war. Und der Compiler muss Wahnsinnsarbeit verrichten, damit er diese Fehler finden kann. Dass sich das trotzdem lohnt zeigt, wie oft diese Fehler vorkommen.



  • anti-freak schrieb:

    wie spricht man denn dann innerhalb der funktion die parameter an?

    http://msdn.microsoft.com/en-us/library/kb57fad8(v=vs.71).aspx

    va_arg, va_start, va_end

    Wie SeppJ aber schon gesagt hat, in C++ verwendet man sowas eigentlich nicht.


Anmelden zum Antworten