【问题标题】:Syntax for a pointer to a function returning a function pointer in C指向在 C 中返回函数指针的函数的指针的语法
【发布时间】:2012-02-02 02:46:15
【问题描述】:

如何声明一个指向返回另一个函数指针的函数的指针? 请与我分享语法和示例代码sn-p。

另外,什么情况下会使用返回函数指针的函数指针?

【问题讨论】:

  • 请不要在帖子末尾添加您的名字,因为您的签名会自动出现在帖子末尾! stackoverflow.com/faq#signatures
  • 我已经调整了您的标题和文本,以使它们更易于理解。当然,如果您不喜欢这些更改,您可以随意将其切换回来,但我建议您仔细考虑差异,因为它可能会稍微澄清问题。

标签: c syntax declaration


【解决方案1】:

如果你不想要第二个 typedef,

typedef float(*(*fptr_t)(int))(double)

这意味着“declare fptr_t as pointer to function (int) returning pointer to function (double) returning float”(fptr_t : int → (double → float))

【讨论】:

  • 声明看起来不错,但不确定分配和使用此指针调用函数。它与普通函数指针调用相同吗?另外,请给我一个代码sn-p,这让我很清楚。
【解决方案2】:

如果你避免使用typedef,那就很难了。例如,考虑 C 标准中的 signal()

extern void (*signal(int, void (*)(int)))(int);

void handler(int signum)
{
    ...
}

if (signal(SIGINT, SIG_IGN) != SIG_IGN)
    signal(SIGINT, handler);

使用typedef,更简单:

typedef void Handler(int);
extern Handler *signal(int, Handler *);

void handler(int signum)
{
    ...
}

if (signal(SIGINT, SIG_IGN) != SIG_IGN)
    signal(SIGINT, handler);

请注意,对于signal() 函数,您通常只需使用<signal.h> 并让系统担心声明它。

【讨论】:

  • 在您的 typedef 示例中,不应该使用 (*Handler) 定义 Handler,然后作为 extern Handler signal(int, Handler) 发出信号吗? C 中的函数指针语法是一团糟,恕我直言,它有两种完全一样的不同语法。
  • @Spidey:您建议的可能是更典型的方法,但显示的方法也可以正常工作。优点是您可以在声明中看到指针。两者都有效。
  • 酷。最让我困扰的是 (main == &main) 是真的。这可能是为了与旧代码库兼容,但如果我要定义一个代码标准,那将是我确保明确使用哪种符号的第一点。
  • @Spidey:这是一个稍微不同的话题。函数指针与指向数据的指针完全不同,您可以使用多个* 来取消引用它们(与一个* 具有相同的效果),并且您可以获取函数名称的地址并最终得到相同的值(这就是您的main == &main 显示的内容)。鉴于:void (*func)(void); 已适当初始化,您可以使用以下任何一种调用函数:func(); (*func)(); (**func)(); (***func)(); 等。第 6.5.2.2 节的C99 Rationale 明确显示了类似的符号。
【解决方案3】:

这对于 typedef 来说是微不足道的:

typedef int(*FP0)(void);
typedef FP0(*FP1)(void);

FP1 是指向函数的指针类型,该函数返回 FP0 类型的函数指针。

至于什么时候有用,好吧,如果你有一个返回函数指针的函数,你需要获取或存储指向这个函数的指针。

【讨论】:

  • 声明很好,但是你能给我一个使用函数指针并返回函数指针的代码 sn-p。这将有助于我清楚地理解。另外,给我带和不带 typedef 的语法..
  • Typedef 并不总是可行的。 IE。当你没有一个编译器来做模板别名,并且你想从一个函数模板返回一个函数指针,并且返回的签名取决于一个模板参数。 (您可以通过使用“身份类型特征”来“解决它”)
  • 附言。或者,当然,C++11 后期返回类型 :) template <...> auto foo() -> int(*)(void) 可以正常工作
猜你喜欢
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2020-04-29
  • 2011-01-12
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多