0

为了实现类似 C# 的调用方法,我需要将 C++ 代码与程序集结合起来。但是当我将浮点数传递给它时遇到了麻烦,发现这些参数是通过一些浮点指令传递的。

那么有什么方法可以强制 g++ 使用公共堆栈(esp)?谢谢。

4

2 回答 2

2

从评论中,我认为您基本上是在尝试使用std::functionand 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 返回值且无参数”,char(short, float)将是“char 返回值并接受一个short和a浮动”等)

std::bind(Function, args...)返回未指定类型的可调用对象。然后将您传递给的参数bind转发给该函数。std::function包装任何类型的可调用对象,包括函数指针和std::bind调用结果,因此您无需担心所调用对象的类型。

更重要的是,如果你提供了不正确的参数,bind而不是费力地通过反汇编来找出问题所在,你会得到编译时错误。您还可以将复合类型传递给bind(结构、联合),甚至是非 POD 类型。

于 2013-09-17T03:24:50.490 回答
2

更改装配侧以匹配。汇编不受调用约定的约束。

如果是第三方程序集,在程序集中构建一个代理函数,移动参数,然后跳转到真正的函数。

于 2013-09-17T02:37:51.137 回答