gpt4 book ai didi

c++ - 调用未知参数的函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:38 25 4
gpt4 key购买 nike

我必须用很少的参数调用函数。我不知道参数的数量,但它们在编译时间是众所周知的。我需要存储它并转换为 (void*)() 但是当重新调用它时,需要用参数调用它。我假设参数将在堆栈上。

void f(int a, int b)
{
...
}

(void*)() c = (void*)()f;

...
pop param2;
pop param1;
call c;

有可能做这样的事情吗?我需要它,因为我正在寻找一种方法如何从我的解释器调用函数,并希望有类似编译时间函数注册的东西,而不是直接从我的汇编器调用它。所以我假设函数的参数将在我自己的堆栈上。我可以将它们重写为真正的堆栈,然后使用此参数调用函数。

或者也许还有其他方法可以做到这一点?

我正在使用 GCC。

这个临时解决了我的问题,但它远非理想:

auto& called = ctx.Functions[funcName];
shortWord param1;
shortWord param2;
switch(called.ParametersCount)
{
case 0:
called.Address();
break;
case 1:
param1 = ctx.Locals.top();
ctx.Locals.pop();
(reinterpret_cast<void (*)(void*)>(called.Address))((void*)param1);
break;
case 2:
param1 = ctx.Locals.top();
ctx.Locals.pop();
param2 = ctx.Locals.top();
ctx.Locals.pop();
(reinterpret_cast<void (*)(void*, void*)>(called.Address))((void*)param1, (void*)param2);
break;
}

void ABC(shortWord sw)
{
shortWord tmp = sw;
for(int i = 0; i < tmp; ++i)
{
std::cout<<i<<std::endl;
}
}

最佳答案

在 C 中,您必须手动执行调用约定,但这并不难,请查看 http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl或者考虑使用 libffi 来帮助你。您也可以在 C++ 中使用 libffi,但它不支持所有调用约定(例如虚拟调用或对非虚拟类函数的调用)

在 C++ 中你可以使用 std::bind,但是 std::bind 需要一个完整的函数类型,你不能简单地调用一个

typedef void (*n)();

你可以创建一个宏来自动定义函数和 std::function 引用并将它存储在某个地方,这样你以后可以使用 std::bind 调用它,减去定义它看起来像这样

#include <iostream>
#include <functional>
#include <stdio.h>

double d(double x, double y) { return x / y; }
std::function<double(double, double)> d_ref = d;


int main()
{
double v1 = 10;
double v2 = 20;

printf("out1: %f\n", d(v1, v2));

auto fn_d = std::bind(d_ref, v1, v2);

printf("out2: %f\n", fn_d());

printf("ok");
getchar();
}

关于c++ - 调用未知参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com