C++ 使用未知参数调用函数

C++ 使用未知参数调用函数,c++,C++,我必须用很少的参数调用函数。我不知道参数的数量,但它们在编译时是众所周知的。我需要存储它并强制转换到(void*)(),但当重新调用它时,需要使用参数调用它。我假设参数将在堆栈上 void f(int a, int b) { ... } (void*)() c = (void*)()f; ... pop param2; pop param1; call c; 有可能这样做吗?我需要它,因为我正在寻找一种方法,如何从我的解释器调用函数,并希望有类似于编译时间函数注册的东西,而不是直接从

我必须用很少的参数调用函数。我不知道参数的数量,但它们在编译时是众所周知的。我需要存储它并强制转换到(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;
    }
}
auto&called=ctx.Functions[funcName];
短词param1;
短词param2;
开关(称为.ParametersCount)
{
案例0:
调用.Address();
打破
案例1:
param1=ctx.Locals.top();
ctx.Locals.pop();
(重新解释铸造(称为地址))((void*)参数1);
打破
案例2:
param1=ctx.Locals.top();
ctx.Locals.pop();
param2=ctx.Locals.top();
ctx.Locals.pop();
(重新解释铸造(称为地址))((void*)参数1,(void*)参数2);
打破
}
无效ABC(短词sw)
{
短词tmp=sw;
对于(int i=0;iSt::CUT

C,您必须手动调用调用约定,但它不是很难,请检查或考虑使用LBFFI来帮助您。也可以在LC++中使用LBFFI,但它不支持所有调用约定(例如,虚调用,或调用非虚类函数)

<>在C++中,你可以使用STD::BIN,但是STD::BIN期望一个完整的函数类型,你不能简单地调用一个

typedef void (*n)();
您可以创建一个宏来自动定义函数和std::function引用,并将其存储在某个位置,以便以后可以使用std::bind调用它,而不使用define,它看起来像这样

#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();
}
#包括
#包括
#包括
双d(双x,双y){返回x/y;}
std::函数d_ref=d;
int main()
{
双v1=10;
双v2=20;
printf(“out1:%f\n”,d(v1,v2));
自动fn_d=std::bind(d_ref,v1,v2);
printf(“out2:%f\n”,fn_d());
printf(“ok”);
getchar();
}

选择一个,除非你想要多个答案。C++,但是我假设C在这一点上是相似的,因为我不需要复杂的类型,在C++中不可能进行汇编,但是在C++ 11中,C++可能是可行的: 。@ PuCHACZ可能类似,但可能不是。C和C++对于空洞指针有不同的语义,用于考试。请选择一个。我会结束这个问题,因为它太宽泛了。