Funktionszeiger zurückgeben



  • lecker währen für dich vielleicht auch funktionsobjekte, also objekte die den operator() überladen haben um wie funktionen auszusehen. die sind an einigen stellen echt angenehmer zu verwenden!



  • User--- schrieb:

    Wenn du schon casten willst, dann nimm void* dann stimmt wenigstens der Typ.

    Man kann Funktionszeiger nicht nach void* casten.

    Felix



  • Phoemuex schrieb:

    Man kann Funktionszeiger nicht nach void* casten.

    Natürlich kann und darf man das. Was man nicht darf, ist nach void* konvertieren (einen neuen void* mit dem gecasteten void* initialisieren - das wäre tödlich). Man darf auch nur in das zurück-casten was es vorher mal war. Da durch den cast nach void* der Typ wech is, eine heikle Angelegenheit.



  • 7H3 N4C3R schrieb:

    Phoemuex schrieb:

    Man kann Funktionszeiger nicht nach void* casten.

    Natürlich kann und darf man das. Was man nicht darf, ist nach void* konvertieren (einen neuen void* mit dem gecasteten void* initialisieren - das wäre tödlich).

    In einen Typ casten und in einen Typ konvertieren sind zwei Namen für dasselbe Ding. Es gibt auch keine zwei Arten von void* -- einmal "gecasteter" und einmal "richtiger" oder sowas. Es gibt höchstens lvalues und rvalues, aber das tut hier nichts zur Sache, das kannst du nicht gemeint haben.



  • Ja, da hast Du recht. Was ich meinte, war eine Intialiserung eines neuen Wertes, nicht Konvertierung.

    Ich hab's aber auch nochmal nachgeschaut - eine Konvertierung von function pointer nach void Pointer scheint wirklich nicht vorgesehen zu sein. Dachte eigentlich, das sei zulässig, solange man keinen Unfug damit treibt.



  • sorry, warum soll man nen Funktionszeiger nicht nach void* casten können und das dann wieder nem anderen void* zuweisen und das noch einem? Klar geht das, möchte ich sagen ... Wie kommt Ihr da drauf, dass das nicht gehen soll?



  • Weil auf jeden Fall beide nicht gleich-breit sein müssen.



  • deswegen:

    "ComeauTest.c", line 9: error: a value of type "void (*)()" cannot be used to
    initialize an entity of type "void *"

    hm, hab ich nicht gewusst 🙂



  • Hallo,

    Das ist nicht standardkonform, geht aber (zumindest mit g++) mit einem C-style Cast.



  • Braunstein schrieb:

    Das ist nicht standardkonform

    Korrekt. Zumindest nicht konform zum C++ Standard. Auf POSIX-konformen Systemen ist aber garantiert, dass void* und Funktionszeiger die selbe größe haben. Hier ist ein (C-Style-Cast) von Funktionszeiger nach void* und zurück ok.


Anmelden zum Antworten