-1

如果我有一个功能

int foo() {
  /* stuff */
}

我想向其发送参数(尽管这是一种不好的做法):

int main(void) {
    int arg1 = 3;
    int arg2 = 4;
    foo(arg1, arg2);
    return 0;
}

那么,如何引用参数arg1arg2内部foo()

4

4 回答 4

3

有什么问题int foo(int arg1, int arg2);

如果您不确定要传递的参数数量,请查看可变参数函数

于 2013-05-28T08:50:50.293 回答
2

这不完全是您想要的,并且完全不可移植,但它说明了原理。您可能必须调整偏移量,如果调用函数(在本例中为 main)在堆栈上有其他变量,则偏移量会有所不同。当然,如果目标平台有一个向另一个方向增长的堆栈,则您必须将循环更改为倒计时 p。

#include <stdio.h>

int foo(void) {
        int *p;
        int a, b;
        int i;

        for (i = 0; i < 32; i++) {
                p = (&i + i);
                printf("i %d : p %p %d\n", i, p, *p);
        }
        a = *(&i + 11);
        b = *(&i + 10);
        printf("a %d\n", a);
        printf("b %d\n", b);
        return a + b;
}

int main(void) {
        int a = 8;
        int b = 2;

        foo();
        return 0;
}

而且为了记录,这种东西既有趣又有用。特别是,了解何时调试是非常宝贵的。所以我认为这个问题很好。这并不意味着这种事情应该最终出现在任何“生产”代码中。

于 2013-05-28T09:07:32.123 回答
0

感谢您的建议。对于我介绍的问题,我建议的解决方案如下:

static int helper(int argc, ...) {
  unsigned *argv = (unsigned *) (void *)(&argc + 1);

  switch (argc) {
  case 0: /* do stuff */ 
  case 1: /* do stuff with argv[0] */
  case 2: /* do stuff with argv[0], argv[1] */
  ...
  case n: /* do stuff with argv[0], argv[1], ..., argv[n] */
  }
}

int goo(void) {
  return helper(0);
}

int bar(int arg1) {
  return helper(1, arg1);
}

int foo(int arg1, int arg2) {
  return helper(2, arg1, arg2);
}

int main(void) {
  int arg1 = 3;
  int arg2 = 4;
  return foo(arg1, arg2);
}
于 2013-05-28T09:41:26.163 回答
0

您可以通过拥有全局状态和辅助函数来解决它:

static int foo_i, foo_j;
static void foo_setup(int i, int j) {
    foo_i = i; foo_j = j;
}

int foo() {
    return foo_i % foo_j;
}


int main() {
    foo_setup(10,40);
    printf("%d\n", foo());
}

要确定这是否适合您,您必须考虑此解决方案是不可重入的。如果您使用线程,您可能需要同步对 foo_setup 和 foo 的调用。同样,如果您在调用 foo_setup 后不立即调用 foo,则需要仔细设计您的代码,以免在两者之间使用调用 foo_setup 的代码。

如果可以使用 c++,则可以通过构造函数传递参数并为结构定义operator()方法。

于 2013-05-28T09:05:09.847 回答