如何将省略号参数传递给 makecontext,makecontext 也接受 C 中的省略号参数



我有一个运行其他函数的函数,这些函数可以有可变数量的参数。

然后将该函数的参数传递给 makecontext ,后者将函数附加到ucontext_t结构,但问题是该函数也接受可变数量的参数。

所以我的问题是,鉴于我无法更改 makecontext,如何将从函数获得的省略号参数传递给 makecontext

void run_function(void (*func), int argc, ...) {
    va_list vl;
    va_start(vl, argc);
    
    makecontext(&ucontext, argc, ...);
    va_end(vl);
}

正如@nemequ在评论中指出的那样,使用像gcc这样的编译器,可以使用可变参数宏。但

  • va_start(( 宏在变量参数数之前至少需要一个参数:最后一个参数是变量参数列表之前最后一个参数的名称;
  • 传递给 makecontext(( 的函数 func(( 在调用时传递可变数量的参数,但不传递 argc 参数。

因此,宏包装器强制 argc 作为 func(( 的第一个参数,使其使用 va_start((

#include <ucontext.h>
#include <stdio.h>
#include <stdarg.h>
#define run_function(ucp, func, argc, ...) 
           makecontext(ucp, func, (argc) + 1, argc, ##__VA_ARGS__)
typedef void (* ucfunc_t)(void);
void func1(int argc, ...)
{
  va_list ap;
  int param;
  int i;
  va_start(ap, argc);
  printf("func1() running with %d parameters:n", argc);
  for (i = 0; i < argc; i ++) {
    param = va_arg(ap, int);
    printf("t%dn", param);
  }
  va_end(ap);
}
int main(void)
{
  ucontext_t main_uc, uc1, uc2, uc3;
  char stack1[4096], stack2[4096], stack3[4096];
  getcontext(&uc1);
  uc1.uc_link = &main_uc;
  uc1.uc_stack.ss_sp = stack1;
  uc1.uc_stack.ss_size = sizeof(stack1);
  getcontext(&uc2);
  uc2.uc_link = &uc1;
  uc2.uc_stack.ss_sp = stack2;
  uc2.uc_stack.ss_size = sizeof(stack2);
  getcontext(&uc3);
  uc3.uc_link = &uc2;
  uc3.uc_stack.ss_sp = stack3;
  uc3.uc_stack.ss_size = sizeof(stack3);
  run_function(&uc1, (ucfunc_t)func1, 0);
  run_function(&uc2, (ucfunc_t)func1, 5, 1, 2, 3, 4, 5);
  run_function(&uc3, (ucfunc_t)func1, 2, 1, 2);
  getcontext(&main_uc);
  main_uc.uc_link = NULL;
  swapcontext(&main_uc, &uc3);
  return 0;
}

前面的示例给出:

$ gcc ex1.c -o ex1
$ ./ex1 
func1() running with 2 parameters:
    1
    2
func1() running with 5 parameters:
    1
    2
    3
    4
    5
func1() running with 0 parameters:

相关内容

  • 没有找到相关文章

最新更新