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
Eine Funktion wird deklariert, um einen "generischen" Zeiger zurückzugeben. Die andere Funktion wird deklariert, nichts zurückzugeben. –
Haben Sie vom Compiler auf Warnungen überprüft? Die erste Funktion sieht nicht ganz richtig aus. –
'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. –