你能将一个函数参数结构传递给一个函数吗?

Sam*_*gen 2 c

我正在使用第三方库(包含我无法编辑的代码!),它具有一个带有大量参数的函数.使用它看起来有点像这样:

void func(int a, int b, int c, int d, int e) {
  //do something...
}

int main(void) {
  func(1, 2, 3, 4, 5);
}
Run Code Online (Sandbox Code Playgroud)

但是,它需要这些参数并立即抛弃它们.我想坚持这些论点并将其用于其他事情.什么我喜欢做的是一样的东西:

void func(int a, int b, int c, int d, int e) {
  //do something...
}

typedef struct foo foo;
struct foo {
  int a;
  int b;
  int c;
  int d;
  int e;
};

foo bar = {1, 2, 3, 4, 5};

int main(void) {
  func(bar);
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这会引发类型错误:

main.c:17:8: error: incompatible type for argument 1 of 'func'
   func(bar);
        ^~~
main.c:12:6: note: expected 'int' but argument is of type 'foo {aka struct foo}'
 void func(int a, int b, int c, int d, int e) {
      ^~~~
main.c:17:3: error: too few arguments to function 'func'
   func(bar);
   ^~~~
Run Code Online (Sandbox Code Playgroud)

做的func(bar.a, bar.b, bar.c, bar.d, bar.e);工作,但它是罗嗦的.有什么指针魔法我可以做到绕过这个吗?同样,我无法修改库代码.

Ron*_*n C 6

不,没有办法做到这一点.但是如果你经常调用这个函数,可能值得将函数包装在你自己的函数中,这样你就可以将一个指针作为参数传递给一个struct,然后让你的函数通过它不太优雅的参数方法调用实际的函数.

值得一提的是,对于传递的每个参数,一个项目被推入堆栈,因此如果函数需要特定数量的参数,则在二进制级别,它期望在堆栈上推送许多参数.对于你无法控制的功能,你不能改变这一点.