返回函数指针types

通常我觉得需要编写返回函数指针的函数。 每当我这样做,我使用的基本格式是:

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

但是,当处理大量的函数时,这会变得麻烦,所以我不想为每个函数声明一个typedef(或者为每个类的函数)

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

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

但后来我不知道该为函数的返回types设置什么。 我努力了:

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

但是会报告一个语法错误。 如何声明这种函数的返回types,而不声明函数指针的typedef。 这甚至有可能吗? 另外请注意,我知道,为每个函数声明typedef似乎会更干净,但是,我非常小心地将我的代码构造得尽可能干净和容易。 我想消除types定义的原因是它们通常只用于声明检索function,因此在代码中似乎是多余的。

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

你大概可以做一些事情:

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

但上帝,我希望我永远不会debugging你的代码….

这是一个愚蠢的例子,但它很简单,它不会给出错误。 这只是关于声明静态函数:

 #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;} 

在C ++类中包装一些C代码的时候,我和原来的海报有着同样的愿望:从一个函数返回一个函数指针,而不是使用函数指针原型的typedef 。 我碰到了一个C ++ const正确性的问题,我认为它值得分享,即使它有点偏离主题(C ++),但它直接与原始问题有关:返回一个C函数指针的语法,而不使用typedef

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

(难倒我一段时间)是如何声明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; } 

因为它需要一个函数,并且返回一个函数,所以这里把它留在这里,因为它比已经给出的答案有点技巧:

 #include <stdio.h> int (*idputs(int (*puts)(const char *)))(const char *) { return puts; } int main(int argc, char **argv) { idputs(puts)("Hey!"); return 0; } 

我想你有三个select:

  1. 坚持typedef。 在一天结束时,这是typedef的工作。
  2. 返回void *并投射它。
  3. 重新考虑你的软件架构。 也许你可以跟我们分享你想要达到的目标,看看我们能否指引你朝着更好的方向发展。