为了实现类似C#的invoke方法,我需要将C ++代码与程序集结合起来。但是当我向它传递浮点数时,我遇到了麻烦,发现这些参数是通过一些浮点指令传递的。
那么有没有办法强迫g ++使用公共堆栈(esp)?感谢。
答案 0 :(得分:2)
更改装配面以匹配。程序集不受调用约定的约束。
如果是第三方程序集,请在程序集中构建一个代理函数来移动参数,然后跳转到实际函数。
答案 1 :(得分:2)
从评论中,我认为您基本上是尝试使用std::function
和std::bind
(来自C ++ 11)提供的类型安全功能来实现目标。
#include <functional>
#include <iostream>
using namespace std;
void foo(int x, double y, float z)
{
cout << x << ", " << y << ", " << z << endl;
}
void call_agent(void* pointer)
{
function<void()>* wrapper = reinterpret_cast<function<void()>*>(pointer);
(*wrapper)();
delete wrapper;
}
int main()
{
function<void()>* callback = new function<void()>(bind(&foo, 1, 7.5, 8.4f));
call_agent(callback);
}
只需将指向std::function<void()>
对象的指针传递给awake
函数(并在调用它们后将其delete
传递给它们)。 void()
作为模板参数意味着包装函数应该没有返回值并且不接受任何参数,你可以根据需要调整它(int()
将是“int返回值而没有参数”,{{ 1}}将是“char返回值并接受短和浮动”等。)
std::bind(Function, args...)
返回未指定类型的可调用对象。然后,传递给char(short, float)
的参数将转发给该函数。 std::function
包装任何类型的可调用对象,包括函数指针和bind
调用的结果,因此您不必担心要调用的事物的类型。
更重要的是,如果向std::bind
提供不正确的参数,则会遇到编译时错误,而不必通过反汇编来弄清楚出了什么问题。您还可以将复合类型传递给bind
(结构,联合),甚至非POD类型。