[英]c++: is it safe to cast pointer to functions?
我想知道将double (*)(double)
为double(*)(...)
,这将用于概括可能具有指向多个函数的指针的代码。
到目前为止,我已经存储了将要传递给向量中的函数的所有内容,并且我想知道是否有一种方法可以在通用代码中调用函数(同时传递正确数量的参数)? 我的意思是:
//while initializing
mFunction = sin;
//later in code
double (*generalized)(...) = mFunction;
for(i=0;i<args.size();i++)
pusharg(args[i]);
call(generalized);
- 编辑 -
如果没有一种有效的方法来使用c ++,那么可以使用汇编来轻松调用该函数吗?
你不能直接将double(*)(double)
赋值为double(*)(...)
,但你可以reinterpret_cast
它。 §5.2.10[expr.reinterpret.cast] / 6明确允许转换,但调用转换函数指针将导致未定义的行为:
函数指针可以显式转换为不同类型的函数指针。
通过指向函数类型的指针调用函数的效果是未定义的 ,该函数类型与函数定义中使用的类型不同。
除了将“指向
T1
指针”的prvalue转换为“指向T2
指针”类型(其中T1
和T2
是函数类型)并返回其原始类型产生原始指针值之外,这种指针转换的结果未指定。
很容易理解为什么它会导致UB - 如果我们称之为generalized(1.0, 2.0, 3.0)
呢? 这可能会破坏调用堆栈。 但是如果你在调用它之前将generalized
后置回一个double(*)(double)
就可以了。
是的,允许铸造本身。 但是,用错误的签名来调用它并不是。 注意,如果你想要一个泛型函数指针,最好使用void (*)()
,它就像函数指针的void*
(尽管没有隐式转换)。
或者甚至更好,因为你通常提供特定的参数,使用std::function
和std::bind
(如果你的编译器支持C ++ 11库),或者使用它们的Boost等价物。
制作generalized
volatile将要求编译器遵循ABI规范。 由于需要支持非声明的C函数,如果没有调用除了可变数量的参数之外的函数,这对于具有固定数量的参数的函数来说,这对于大多数ABI(包括x86和x86-32)是安全的。 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.