2013-04-04 13 views
21

Haben Sie über die Zeile Code unten gezeigt Ich denke, es kann eine Umwandlung in einen Funktionszeiger sein, der void zurückgibt und einen void-Zeiger nimmt, ist das richtig?Darsteller zum Funktionszeiger?

(void (*)(void *))SGENT_1_calc 
+0

Guss SGENT_1_calc in Zeiger auf funcname zugeordnet wird Funktion (Zeiger auf void) Rückgabe void –

Antwort

29

Ja, es ist korrekt. Ich finde, dass nicht sehr gut lesbar, so schlage ich vor, erklärt die Signatur der Funktion hingewiesen werden:

typedef void sigrout_t(void*); 

Ich habe auch die Codierung Konvention, die Endung Typen mit rout_t sind solche Typen für Funktionen Signaturen. Man könnte es auch anders nennen, da _t ein Suffix ist reserved von Posix

letztere auf Ich bin Gießen, vielleicht es zu nennen wie

((sigrout_t*) SGENT_1_calc) (someptr); 
+1

Upvoted für die Typedef, stimme ich voll und ganz zu. – Joe

+0

Auf der einen Seite beseitigt die Typedef die Notwendigkeit für redundante und verwirrend (zumindest einige) Klammern. Auf der anderen Seite reduziert es die Fähigkeit, sofort zu bestimmen, was der Cast ist. Wenn Sie herausfinden wollen, dass die Umwandlung zu einem Funktionszeiger ist, müssen Sie nachsehen, was sigrout_t als ... +1 für die Bereitstellung der Alternative definiert ist. – Sebivor

+0

Namen, die auf _t enden, sind für POSIX reserviert, siehe http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html – satur9nine

0

Ja, es ist eine Besetzung wie Sie gesagt haben.

4

Ja, es ist, sollte die Funktion wie diese

suchen werden
void func(void*); 

Aber die Aussage fehlt ein Ziel, da eine Besetzung zu nichts nutzlos ist. So soll es sein wie

func = (void (*)(void *))SGENT_1_calc; 
0

ja es ist ein Funktionszeiger, die Sie auf eine Funktion mit proto Leeren funcname zuweisen (void *) Hier ist die SGENT_1_calc direkt