2017-07-01 4 views
-6

Ich wusste, die void *function() ist der Zeiger, der auf eine Funktion zeigt, aber ich weiß nicht, wie anders sie arbeiten und wenn wir void *function() verwenden? Ich habe etwas in der Assembly untersucht, um zu vergleichen, wie sie hinter der Szene arbeiten und wie sie aussehen. Hier ist die C++ Code:Was ist der Unterschied zwischen "void function()" und "void * function()"?

void *bar(){ 
     std::cout << "bar" << std::endl; 
} 

void foo(){ 
     std::cout << "foo" << std::endl; 
} 

int main(void){ 
     foo(); 
     bar(); 

     return 0; 
} 

Und das ist eine Montageanleitung I erhalten von objdump

void *bar(){ 
    400846:  55      push %rbp 
    400847:  48 89 e5    mov %rsp,%rbp 
     std::cout << "bar" << std::endl; 
    40084a:  be 84 09 40 00   mov $0x400984,%esi 
    40084f:  bf 60 10 60 00   mov $0x601060,%edi 
    400854:  e8 b7 fe ff ff   callq 400710 <[email protected]> 
    400859:  be 30 07 40 00   mov $0x400730,%esi 
    40085e:  48 89 c7    mov %rax,%rdi 
    400861:  e8 ba fe ff ff   callq 400720 <[email protected]> 
} 
    400866:  90      nop 
    400867:  5d      pop %rbp 
    400868:  c3      retq 

0000000000400869 <_Z3foov>: 

void foo(){ 
    400869:  55      push %rbp 
    40086a:  48 89 e5    mov %rsp,%rbp 
     std::cout << "foo" << std::endl; 
    40086d:  be 88 09 40 00   mov $0x400988,%esi 
    400872:  bf 60 10 60 00   mov $0x601060,%edi 
    400877:  e8 94 fe ff ff   callq 400710 <[email protected]> 
    40087c:  be 30 07 40 00   mov $0x400730,%esi 
    400881:  48 89 c7    mov %rax,%rdi 
    400884:  e8 97 fe ff ff   callq 400720 <[email protected]> 
} 
    400889:  90      nop 
    40088a:  5d      pop %rbp 
    40088b:  c3      retq 

000000000040088c <main>: 

int main(void){ 
    40088c:  55      push %rbp 
    40088d:  48 89 e5    mov %rsp,%rbp 
     foo(); 
    400890:  e8 d4 ff ff ff   callq 400869 <_Z3foov> 
     bar(); 
    400895:  e8 ac ff ff ff   callq 400846 <_Z3barv> 

     return 0; 
    40089a:  b8 00 00 00 00   mov $0x0,%eax 
} 
    40089f:  5d      pop %rbp 
    4008a0:  c3      retq 
+0

Eine Funktion wird deklariert, um einen "generischen" Zeiger zurückzugeben. Die andere Funktion wird deklariert, nichts zurückzugeben. –

+0

Haben Sie vom Compiler auf Warnungen überprüft? Die erste Funktion sieht nicht ganz richtig aus. –

+2

'bar' gibt einen' void' Zeiger zurück, während 'foo' nichts zurückgibt. Wenn das nicht genug ist, dann müssen Sie ein gutes Buch lesen, bevor Sie fortfahren. –

Antwort

1

Um die Antworten zu wiederholen Sie bereits in den Kommentaren hatte, ist der Unterschied der Typ

zurück
void foo() { ... } 

ist eine Funktion, die nichts zurückgibt, während

void *bar() { ... } 
void* bar() { ... } // Identical 

Return ein void Zeiger. Das Vertauschen der Leerraumposition vor oder nach dem * macht hier keinen Unterschied, aber es kann deutlicher machen, was der Rückgabetyp ist. Und natürlich stellen Sie sicher, dass Sie im Fall dieser bar Funktion etwas zurückgeben, oder Sie werden mindestens eine Compiler-Warnung und undefiniertes Verhalten haben.

Also im Grunde sind dies nur zwei etwas andere Bedeutungen des Keywords void zu erinnern. Wenn Sie mit C++ nicht vertraut sind, gibt es eine gute Menge an barrierefreien Büchern, die Ihnen ebenfalls helfen können.

-1

void zurückgeben nichts

void * kehrt Zeiger

nicht Vergeuden Ihre Zeit lesen Demontage Listen - richtig lernen C stattdessen

Warnungen nicht ignorieren !!!!!!

void *bar(){ 
     std::cout << "bar" << std::endl; 
} 

Sie haben gleiche Warnungen erhalten? Hast du nicht?

wusste, dass ich die void * function() ist der Zeiger, die auf eine Funktion

Jetzt wissen Sie nicht. Es ist nicht der Funktionszeiger. Lernen Sie zuerst C oder C++.

0

void gibt nichts zurück.

void* gibt einen Zeiger auf etwas zurück, von dem der Typ nicht bekannt ist. Es ist etwas, das Sie normalerweise nicht zurückgeben möchten, sondern den Typ des Objekts, das Sie zurückgeben möchten, um die Typensicherheit zu gewährleisten. Die einzige Stelle, an der Sie void* als Rückgabetyp verwenden möchten, ist der Umgang mit dem Rohspeicher. Zum Beispiel geben malloc und new eine void* zurück, weil ihr Rückgabewert keinen Typ hat (das liegt an dem Aufrufer von malloc oder new).

Ihre bar Funktion ist falsch, weil der Rückgabetyp ein void* ist, aber Sie nichts zurückgeben.

Verwandte Themen