2017-07-01 161 views
-6

我知道void *function()是指向一个函数的指针,但我不知道它们的工作方式有多不同,当我们使用void *function()时? 我在装配中做了一些研究,以比较它们在幕后的工作方式,看起来像是一样的。 这里是C++代码:“void function()”和“void * function()”有什么区别?

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

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

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

     return 0; 
} 

这是汇编指令我从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

一个函数被声明为返回一个“通用”指针。另一个函数被声明为不返回任何内容。' –

+0

您是否检查过编译器的警告?第一个功能看起来不太正确。 –

+2

'bar'返回一个'void'指针,而'foo'什么也不返回。如果这本身没有差别,那么在继续之前,你需要阅读一本好书。 –

回答

1

要重复你在已经发表的评论的答案,不同的是该类型返回

void foo() { ... } 

是返回一个什么功能,而

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

返回void指针。在*之前或之后交换空间位置在这里没有什么区别,但它可以使得它更清楚返回类型是什么。当然,确保在这个bar函数的情况下实际返回一些东西,否则至少有一个编译器警告和未定义的行为。

所以基本上这只是关键字void记住的两个稍微不同的含义。如果您对C++不熟悉,那么可以获得大量的可访问的书籍,可以帮助您。

-1

无效收到不返回任何

无效*返回指向

不要浪费你的时间阅读反汇编清单 - 正确学习C而不是

不要忽视警告!!!!!!

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

你已经得到同样的警告?你不是吗?

我知道无效*()函数是指向一个功能

现在你不知道的指针。它不是函数指针。先学习C或C++。

0

void不返回任何东西。

void*返回指向某些类型未知的指针。这是你通常不想返回的东西,而是你想返回的对象的类型,以保证类型安全。处理原始内存时,唯一想要使用void*作为返回类型的地方。例如,mallocnew会返回void*,因为它们的返回值没有类型(即由mallocnew调用者提供)。

您的bar功能是错误的,因为返回类型是void*,但您不返回任何内容。

相关问题