将代码行作为C中的参数传递

时间:2017-10-12 12:54:10

标签: c parameter-passing

我正在开展一个项目,在这个项目中,我的字数限制非常严格(我不能100%确定什么是合格的字词)。

我希望将代码行传递给函数作为参数,我已经在JavaScript中看到了这一点,但我在C中找不到任何内容。

这是关于我正在寻找的:

void onTime(int a, Code myCode) {
    if(timer == a) {
        //run myCode
    }
}

我可以使用这样的东西:

onTime(45, {
    //code
});

C中是否有办法可以做到这样的事情?

1 个答案:

答案 0 :(得分:7)

C不允许传递内联代码(在其他语言中称为lambda表达式)。但是你可以做的是将指针传递给现有函数。

//  typedef for a function that takes no arguments and returns void
typedef void (*ftype)(void);

void func_to_run(void)
{
    ...
}

void onTime(int a, ftype code) {
    if(timer == a) {
        code();
    }
}

然后您可以这样称呼它:

ontime(45, func_to_run);

如果你希望函数与它使用的一组值打包,那么类似于具有可以访问成员变量的成员函数的C ++类,这涉及一些技巧。

以下是您可以采取以下措施的示例:

#include <stdio.h>

typedef int (*ftype)(int, int);

struct c {
    int a;
    int b;
    ftype add_func;
    ftype sub_func;
};

#define ADD(s) (s)->add_func((s)->a,(s)->b)
#define SUB(s) (s)->sub_func((s)->a,(s)->b)

int add(int a, int b)
{
    return a+b;
}

int sub(int a, int b)
{
    return a-b;
}

void run(struct c *op)
{
    printf("add result=%d\n", ADD(op));
    printf("sub result=%d\n", SUB(op));
}

int main()
{
    struct c c1 = { 1, 2, add, sub };
    struct c c2 = { 3, 4, add, sub };
    struct c c3 = { 6, 1, add, sub };
    struct c c4 = { 9, 4, add, sub };

    run(&c1);
    run(&c2);
    run(&c3);
    run(&c4);
}

这里我们定义一个struct c,它包含两个函数和另外两个变量的函数指针。

ADDSUB用于运行&#34;成员&#34;结构的功能并将它们传递给&#34;私有&#34;会员使用。它隐藏了这样一个事实,即被调用的实际函数与传递给它的参数无关。

此代码输出:

add result=3
sub result=-1
add result=7
sub result=-1
add result=7
sub result=5
add result=13
sub result=5

当然,一旦你开始这样做,你就会(粗略地)做C ++正在做的事情,并且可能最好切换到为OOP制作的C ++,现在支持lambdas。