19

我想声明一个指向函数的指针类型的变量,返回指向函数的指针。本质上是以下内容,但没有任何typedefs:

typedef void (*func)();
typedef func (*funky_func)();

funky_func ptr;

我尝试了以下

(void (*)()) (*ptr)();

但它给出了一个“未声明的标识符” - 错误ptr(可能是由于完全不同的解析)。由于不精通解析 C++ 的复杂性,我想知道这是否可能,如果可以,该怎么做。

(出于好奇,请认为这是一个完全人为的场景,没有任何实际原因。我完全知道typedef,如果使用函数指针,实际上 s 是这里的方法。)

4

2 回答 2

26

您可以查看哪个函数的声明,signal()该函数采用 avoid(*)()并返回其中之一。变量ptr可以这样声明:

void (*(*ptr)())()

这个符号有点尴尬,而且从里到外都很清楚。使用尾随返回类型可能更容易:

auto (*ptr)() -> void (*)()

...或者,当然,一直使用尾随返回类型:

auto (*ptr)() -> auto (*)() -> void
于 2013-09-16T11:14:19.100 回答
24

C(和 C++)声明的一般规则是:如果您将声明键入为表达式,它将具有声明的类型。

因此,您需要一个指向函数的指针,该指针返回指向返回 void 的函数的指针。

假设我们有这样一个指针,ptr. 如何void摆脱它?

  1. 取消引用ptr,得到一个函数返回指针,指向返回 void 的函数:*ptr

  2. 调用该函数,获取一个指向返回 void 的函数的指针:(*ptr)()

  3. 取消引用该指针,得到一个返回 void 的函数:*(*ptr)()

  4. 调用该函数,变得无效:(*(*ptr)())()

现在把它变成一个声明:

void (*(*ptr)())();

PS我知道其他人同时回答了(我已经投票了)。但我想展示获得申报表的通用流程。

于 2013-09-16T11:26:28.520 回答