Lau*_*nch 3 c parameter-passing
我正在开展一个项目,在这个项目中我有一个相当严格的字数限制(我不是100%肯定什么是合格的单词).
我希望将代码行传递给函数作为参数,我已经在JavaScript中看到了这一点,但我在C中找不到任何内容.
这是我正在寻找的:
void onTime(int a, Code myCode) {
if(timer == a) {
//run myCode
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用这样的东西:
onTime(45, {
//code
});
Run Code Online (Sandbox Code Playgroud)
在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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样调用它:
ontime(45, func_to_run);
Run Code Online (Sandbox Code Playgroud)
如果希望函数与它使用的一组值打包在一起,那么类似于具有可以访问成员变量的成员函数的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);
}
Run Code Online (Sandbox Code Playgroud)
这里我们定义一个struct 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
Run Code Online (Sandbox Code Playgroud)
当然,一旦你开始这样做,你就会(粗略地)做C++正在做的事情,并且可能最好切换到为OOP制作的C++,现在支持lambdas.