2017-06-04 56 views
0
static void (* __set_malloc_handler(void (*__f)()))(); 

我认为__set_malloc_handler是一个函数指针,它指向一个函数,它也需要一个函数指针。但是,我不知道如何理解整个陈述。它是如何工作的?了解这个复杂的声明

+0

'__set_malloc_handler'是一个函数,而不是函数指针。它是参数,返回值是函数指针。 –

+3

[顺时针\螺旋线规则](http://c-faq.com/decl/spiral.anderson.html) – Mahesh

+0

或者,您可以在[左右规则](http:// ieng9。 ucsd.edu/~cs30x/rt_lt.rule.html)。 –

回答

1

使用某些别名更容易理解。

//pointer to function taking no arguments and void return 
typedef void(*function_pointer)(); 

//function taking "function_pointer" and returning "function_pointer" 
function_pointer __set_malloc_handler(function_pointer __f); 

要阅读类似的东西,我建议right-left rule。这是我总是使用的。还有一个spiral rule,但是当它没有形成一个完美的螺旋时,我会感到恼火,而我却因为注意力而分心。你可能不会有这个问题。

这两个页面上的解释更彻底,但是这里有一个速成课程。

本质上,读这些符号为:

  1. * = “指针”
  2. (...) = “功能服用...
  3. [...] =

“大小...的数组”向右阅读,直到找到没有匹配01的呢。然后向左边读,直到找到一个(与之匹配。再次开始阅读。如果你点击右边的那一行,你会看完左边的内容。

标识符__set_malloc_handler的右侧是一个开放的小括号(,表示它是一个函数。从那个到匹配)的所有内容都是参数类型。我建议先忽略它,然后再回来。一步一步:

 __set_malloc_handler(...) //function taking ... 
    (*__set_malloc_handler(...)) //and returning a pointer 
    (*__set_malloc_handler(...))() //to a function taking no arguments 
void (*__set_malloc_handler(...))() //that returns void 

的参数来看,我们有:

 (*__f) //pointer 
    (*__f)() //to function taking no arguments 
void (*__f)() //and returning void 
+0

非常感谢。我喜欢右倾的规则,我从中学到了很多东西。你给了我一条鱼,教我如何钓鱼。再次感谢你。 – Taylor

1

__set_malloc_handler是一个函数,需要一个“函数指针为void功能”,并返回一个“函数指针为void功能”。关键字static仅对当前文件可见。