我正在一个项目中进行严格的字数限制(我不确定100%是否符合字词标准)。
我正在寻找将代码行作为参数传递给函数的方法,我已经在JavaScript中看到了这一点,但是在C语言中却找不到任何东西。
这是关于我在寻找什么:
void onTime(int a, Code myCode) {
if(timer == a) {
//run myCode
}
}
我可以这样使用它:
onTime(45, {
//code
});
在C语言中我有办法做到这一点吗?
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
,其中包含两个函数的函数指针和两个其他变量。
宏ADD
和SUB
用于运行结构的“成员”功能,并将“私有”成员传递给它们使用。它掩盖了一个事实,即实际调用的函数与传递给它的参数无关。
此代码输出:
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] 删除。
我来说两句