我想将函数的地址分配给函数指针,但是要寻址的函数返回一个与自身签名相同的函数指针,导致它以一种我根本无法编写返回类型的方式递归,对于函数指针甚至函数声明本身......
我想有一种简化问题的方法,这样就不会造成混乱:
我如何编写一个函数声明,使其可以返回指向自身的指针(或具有相同签名的任何其他函数)?
????? function(int a){
// could be this function, or another with the same signature,
return arbitraryFunction;
}
?????(*func)(int) = function; // same problem as above
edit:
现在我有一个解决方案,尽管我不会将其作为答案发布,因为它非常丑陋。它通过简单地返回原始数据来摆脱递归void*
指针作为返回类型,最终采用以下形式:
void* function(int parameter){
return arbitraryFunction; // of the same signature
}
void*(*func)(int) = function;
func = reinterpret_cast<void*(*)(int)>(func(42)); // sin
edit2:
看来函数指针和常规指针之间的转换是 UB,所以我不能使用void*
在这种情况下...
要回答其中一条评论,这是为了在程序中的多个“主”循环之间传递控制,每个循环都有自己的函数。有很多方法可以做到这一点,但是在循环中返回函数指针(或 NULL 来终止程序)seemed就像最简单的方法一样,但我没有预料到指向数据的指针和指向函数地址的指针会彼此不兼容。我认为在这种情况下返回多态函数对象最终将是更明智的选择。
不要使用void*
,因为不能保证void *
可以保存函数指针。您可以使用void(*)()
作为解决方法:
typedef void(*void_func)();
typedef void_func (*func_type) (int);
void_func arbitraryFunction(int a) {
// could be this function, or another with the same signature,
cout << "arbitraryFunction\n";
return nullptr;
}
void_func function(int a) {
// could be this function, or another with the same signature,
return (void_func) arbitraryFunction;
}
int main() {
// your code goes here
func_type f = (func_type) function(0);
f(0);
return 0;
}
LIVE http://ideone.com/hEmPyq
C99 [6.2.5/27]:
指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。同样,指向
兼容类型的限定或非限定版本应具有
相同的表示和对齐要求。所有指针指向
结构类型应具有相同的表示和对齐方式
要求彼此一致。所有指向联合类型的指针都应具有
彼此具有相同的表示和对齐要求。指针
其他类型不需要具有相同的表示或对齐方式
要求。
C99[6.3.2.3/8]:
指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再转换回来;结果应比较
等于原来的指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)