繁体   English   中英

c ++:将指针强制转换为函数是否安全?

[英]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指针”类型(其中T1T2是函数类型)并返回其原始类型产生原始指针值之外,这种指针转换的结果未指定。

很容易理解为什么它会导致UB - 如果我们称之为generalized(1.0, 2.0, 3.0)呢? 这可能会破坏调用堆栈。 但是如果你在调用它之前将generalized后置回一个double(*)(double)就可以了。

是的,允许铸造本身。 但是,用错误的签名来调用它并不是。 注意,如果你想要一个泛型函数指针,最好使用void (*)() ,它就像函数指针的void* (尽管没有隐式转换)。

或者甚至更好,因为你通常提供特定的参数,使用std::functionstd::bind (如果你的编译器支持C ++ 11库),或者使用它们的Boost等价物。

制作generalized volatile将要求编译器遵循ABI规范。 由于需要支持非声明的C函数,如果没有调用除了可变数量的参数之外的函数,这对于具有固定数量的参数的函数来说,这对于大多数ABI(包括x86和x86-32)是安全的。 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM