返回函数指针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:
- 坚持typedef。 在一天结束时,这是typedef的工作。
- 返回void *并投射它。
- 重新考虑你的软件架构。 也许你可以跟我们分享你想要达到的目标,看看我们能否指引你朝着更好的方向发展。