如果我有一个功能
int foo() {
/* stuff */
}
我想向其发送参数(尽管这是一种不好的做法):
int main(void) {
int arg1 = 3;
int arg2 = 4;
foo(arg1, arg2);
return 0;
}
那么,如何引用参数arg1
和arg2
内部foo()
?
如果我有一个功能
int foo() {
/* stuff */
}
我想向其发送参数(尽管这是一种不好的做法):
int main(void) {
int arg1 = 3;
int arg2 = 4;
foo(arg1, arg2);
return 0;
}
那么,如何引用参数arg1
和arg2
内部foo()
?
有什么问题int foo(int arg1, int arg2);
?
如果您不确定要传递的参数数量,请查看可变参数函数。
这不完全是您想要的,并且完全不可移植,但它说明了原理。您可能必须调整偏移量,如果调用函数(在本例中为 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;
}
而且为了记录,这种东西既有趣又有用。特别是,了解何时调试是非常宝贵的。所以我认为这个问题很好。这并不意味着这种事情应该最终出现在任何“生产”代码中。
感谢您的建议。对于我介绍的问题,我建议的解决方案如下:
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);
}
您可以通过拥有全局状态和辅助函数来解决它:
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()
方法。