返回函数指针类型

我经常发现需要编写返回函数指针的函数。无论何时,我使用的基本格式是:

typedef int (*function_type)(int,int);


function_type getFunc()
{
function_type test;
test /* = ...*/;
return test;
}

但是,当处理大量函数时,这会变得很麻烦,因此我不想为每个函数(或每个函数类)声明 typedef

我可以删除 typedef 并将函数中返回的局部变量声明为: int (*test)(int a, int b);使函数体看起来像这样:

{
int (*test)(int a, int b);
test /* = ...*/;
return test;
}

但是我不知道该如何设置函数的返回类型。 我试过了:

int(*)(int,int) getFunc()
{
int (*test)(int a, int b);
test /* = ...*/;
return test;
}

但是会报告语法错误。如何在不声明函数指针 typedef 的情况下声明这类函数的返回类型。这有可能吗?还要注意的是,我知道声明 typedef 似乎更简单,但是,我非常小心地将代码结构设计得尽可能简洁易懂。我之所以要删除 typedef,是因为它们通常只用于声明检索函数,因此在代码中似乎是多余的。

64644 次浏览

我觉得你有三个选择:

  1. 坚持使用 typedef。到头来,这是 typedef 的工作。
  2. 返回空白 * 和铸造它。
  3. 重新考虑你的软件架构。也许你可以和我们分享一下你正在努力实现的目标,看看我们是否能为你指明一个更好的方向。
int (*getFunc())(int, int) { … }

这将提供您所要求的声明。此外,正如 Ola1olsson所指出的,最好插入 void:

int (*getFunc(void))(int, int) { … }

这意味着 getFunc可能不采用任何参数,这有助于避免出现错误,比如有人不小心将 getFunc(x, y)写成了 getFunc()(x, y)

这是一个愚蠢的例子,但是它很简单,而且不会出错,它只是声明静态函数:

#include <stdio.h>
#include <stdlib.h>


void * asdf(int);
static int * hjkl(char,float);


main() {
int a = 0;
asdf(a);
}




void * asdf(int a) {return (void *)hjkl; }
static int * hjkl(char a, float b) {int * c; return c;}

你可以这样做:

int foo (char i) {return i*2;}


int (*return_foo()) (char c)
{
return foo;
}

但是上帝啊,我希望我永远不用调试你的代码... ..。

在用 c + + 类包装一些 c 代码的时候,我有一个和原始海报一样的愿望: 从一个函数返回一个函数指针,而不用求助于函数指针原型。我遇到了一个关于 C + + const正确性的问题,我认为这个问题值得分享,即使它有点离题(c + +) ,但它确实与最初的问题直接相关: 返回一个 C 函数指针而不求助于 typedef的语法。

下面的代码定义了一个类 A,它存储一个函数指针,并通过 get_f()调用将其暴露给外部世界。这个函数应该返回一个没有 ABc2的函数指针。

关键(这困扰了我一段时间)是如何声明 get_f()是一个 const函数,也就是说,它不会改变 A

该代码包含两个变体: 第一个使用 typedef 作为函数指针原型,而第二个则完整地写出所有内容。#if在两者之间切换。

#include <iostream>


int my_f(int i)
{
return i + 1;
}


#if 0 // The version using a typedef'ed function pointer


typedef int (*func_t)(int);


class A
{
public:
A(func_t f) : m_f(f) {}
func_t get_f() const { return m_f; }


private:
func_t m_f;
};


int main(int argc, char *argv[])
{
const A a(my_f);
std::cout << "result = " << a.get_f()(2) << std::endl;
}


#else // The version using explicitly prototyped function pointer


class A
{
public:
A(int (*f)(int)) : m_f(f) {}
int (*get_f() const)(int) { return m_f; }


private:
int (*m_f)(int);
};


int main(int argc, char *argv[])
{
const A a(my_f);
std::cout << "result = " << a.get_f()(2) << std::endl;
}


#endif

预期/期望的产出是:

result = 3

关键是 const限定词在这行中的位置:

int (*get_f() const)(int) { return m_f; }

我把这个留在这里,因为它比已经给出的答案要棘手一些,因为它需要一个函数指针

(int (__cdecl *)(const char *))

返回一个函数指针

(int (__cdecl *)(const char *))

#include <stdio.h>


int (*idputs(int (*puts)(const char *)))(const char *) {
return puts;
}


int main(int argc, char **argv)
{
idputs(puts)("Hey!");


return 0;
}

您可以编写以下代码(它只能在 C + + 11及以上版本中使用) :

//C++11
auto func(...) {
int (*fptr)(...) ret = ...
//Do sth.
return ret;//C++11 compiler will automatically deduce the return type for you
}

或者,如果你不喜欢自动返回类型演绎,你可以在函数末尾指定类型(和上面一样,只是在 C + + 11及以上) :

//C++11
auto func(...) -> int (*)(...) { /* Do sth. */ }

简单的例子 fun 函数以 void 作为参数,返回的函数指针应该是 int * 和 int * ,并返回 int *

使用 typedef 检查链接示例 Https://www.geeksforgeeks.org/returning-a-function-pointer-from-a-function-in-c-cpp/

#include <stdio.h>


int* fun1(int* y, int* z)
{
static int var = 0;
var = (*y + *z);
printf("Inside fun1 = %d\n", var );
return &var;
}


int* (*fun())(int*,int*)
{
printf("Inside fun\n");
return &fun1;
}


int main()
{
int a=10,b=20;
int *ptr = NULL;
int* (*(*fp)())(int*,int*) = &fun;
ptr=(*fp())(&a,&b);
printf("*ptr = %d\n", *ptr );
}