Ich bin verwirrt über die Bedeutung von void *function()
.
Ist es ein Zeiger auf eine Funktion oder eine Funktion, die zurückkehrt void*
? Ich habe es immer für Datenstrukturen als rekursive Funktion verwendet, die einen Zeiger zurückgibt, aber als ich einen Code in multithreading ( pthread
) sah, gab es dieselbe Funktionsdeklaration. Jetzt bin ich verwirrt, was der Unterschied zwischen ihnen ist.
c++
c
pointers
function-pointers
declaration
user9515151
quelle
quelle
void*function();
ist syntaktisch korrekt. Zum Beispiel haben sie für Python ein anderes Entscheidungsformat gewählt - das Format ist Teil der Syntax. IMHO haben beide Wege ihre Vor- und Nachteile.void *function()
ist dies eine Funktion, die eine beliebige Anzahl von Argumenten verwendet und einen Wert zurückgibt, der bei Dereferenzierung vom Typ void ist . In C ++void* function()
ist eine Funktion, die keine Argumente akzeptiert und den Wert pointer-to-void zurückgibt . Sie sollten sich entscheiden, nach welcher Sprache Sie fragen.void *
. Selbst wenn Sie könnten, was würden Sie mit einem machenvoid
?Antworten:
Die Funktion hat den Rückgabetyp
void *
.Deshalb ziehe ich es in solchen Fällen immer vor, das Symbol
*
vom Funktionsnamen wie zu trennenUnd wie
Jarod42
in einem Kommentar erwähnt, können Sie die Funktionsdeklaration in C ++ mit dem nachfolgenden Rückgabetyp wie neu schreibenWenn Sie einen Zeiger auf Funktion deklarieren möchten, sollten Sie schreiben
Oder
Oder ein Zeiger auf eine Funktion, der einen Zeiger auf eine Funktion zurückgibt
quelle
void* function();
. Das ist nicht so verlockend ... ;-) (Die Bearbeitung geschah gerade während des Schreibens.)void * reader();
dann aufpthread_create(&thread1,null,reader,reader_arg)
anstelle vonpthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++). :)typedef
für ist ... ;-)Wenn ich mir bei Problemen mit der C-Syntax nicht sicher bin, verwende ich gerne das Dienstprogramm cdecl ( Online-Version ), um es für mich zu interpretieren. Es übersetzt zwischen C-Syntax und Englisch.
Zum Beispiel habe ich Ihr Beispiel eingegeben
void *foo()
und es ist zurückgekehrtUm zu sehen, wie die andere Syntax aussehen würde, habe ich eingegeben
declare foo as pointer to function returning void
und sie zurückgegebenDies ist besonders nützlich, wenn Sie mehrere Ebenen von Typografien, Sternen oder Klammern in einem einzigen Ausdruck haben.
quelle
Es ist eine Funktion, die einen Zeiger auf zurückgibt
void
.Stellen Sie sich Ihre Erklärung folgendermaßen vor:
Dies wäre eine Funktion, die zurückgibt
void
(oder nichts):Stellen Sie sich die obige Erklärung folgendermaßen vor:
Eine viel einfachere Möglichkeit, diese zu schreiben, ist die Verwendung von
typedef
s:Dies beseitigt im Allgemeinen die Verwirrung um Funktionszeiger und ist viel einfacher zu lesen.
quelle
Deklarationen in C / C ++ werden nach der Priorität des Operators vom Bezeichner nach außen gelesen .
Ein kurzer Blick auf die Prioritätstabelle des C / C ++ - Operators in Wikipedia zeigt, dass der Funktionsaufrufoperator
()
eine höhere Priorität hat als der Indirektionsoperator*
. Ihre Funktionsdeklarationen lauten also wie folgt:Beginnen Sie mit der Kennung:
function
isfunction()
Eine Funktion, die keine Argumente akzeptiertvoid* function()
und gibt a zurückvoid*
.Dieses allgemeine Prinzip gilt auch für Array-Deklarationen (hat
[]
ebenfalls eine höhere Priorität als*
) und Kombinationen der beiden. Damitwird gelesen als
arr
istarr[42]
ein Array von 42 Elementen, die sind*arr[42]
Zeiger auf(*arr[42])()
Funktionen, die keine Argumente annehmen undint *(*arr[42])()
Rückgabe einesint*
.Es dauert ein bisschen, bis man sich daran gewöhnt hat, aber wenn man das Prinzip verstanden hat, ist es einfach, diese Erklärungen eindeutig zu lesen.
quelle