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

劳伦·欣奇

我正在一个项目中进行严格的字数限制(我不确定100%是否符合字词标准)。

我正在寻找将代码行作为参数传递给函数的方法,我已经在JavaScript中看到了这一点,但是在C语言中却找不到任何东西。

这是关于我在寻找什么:

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

我可以这样使用它:

onTime(45, {
    //code
});

在C语言中我有办法做到这一点吗?

dbush

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);
}

在这里,我们定义了一个结构c,其中包含两个函数的函数指针和两个其他变量。

ADDSUB用于运行结构的“成员”功能,并将“私有”成员传递给它们使用。它掩盖了一个事实,即实际调用的函数与传递给它的参数无关。

此代码输出:

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设计并现在支持lambda的C ++。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C将指针作为函数中的参数传递

在C#中仅将类型作为参数传递

将枚举作为参数传递给 C# 中的方法

将动作委托作为C#中的参数传递

C# 将 List<T> 中的对象作为参数传递

将C#类属性作为方法中的参数传递

无法将子接口作为C#中的参数传递

作为参数传递时,在函数中更新指针地址。[将指针作为C中的引用传递]

将文件列表的文本文件中的行传递到参数或作为参数传递

如果传递的函数也将函数作为参数,如何将函数作为参数传递给C中的函数?

将函数作为类中的参数传递

将枚举作为函数中的参数传递

将indeces作为R中的参数传递

将结构作为函数中的参数传递

C ++将类作为参数传递

将lambda函数作为参数C ++传递

如何将枚举值作为参数传递给代码模型中的调用?

如何将任意代码块作为参数传递给C宏

在 Autofac/c# 中的方法中作为参数传递时解析类型(请检查示例代码)

SwiftUI将Swift代码作为可重用视图的参数传递

将代码作为参数传递给R函数

将函数作为参数传递以避免重复代码

如何将指针传递给在 C++ 中作为引用传递参数的函数

将.txt文件中的每一行作为python函数中的参数值传递/缩进

在C ++中以状态作为参数传递Functor

函数中的C ++代码作为参数

将整个行作为附加参数传递给PySpark中的UDF

如何将文件中的每一行作为脚本的参数传递?

将数据帧行值迭代(循环)作为 Python 函数中的参数传递