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

问题描述:

我正在研究一个项目,其中我对相当严格的字数限制(我不是100%确定符合条件的字)。传递代码的行数作为C中的参数

我期待的代码行传递到一个函数作为参数,我已经看到了在JavaScript中完成这件事,但C.

我找不到它的任何

这是什么我要找为:

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

而且我可以用它是这样的:

onTime(45, { 
    //code 
}); 

有没有用C的方式,我可以做这样的事情?

+1

你不能在C中做到这一点,我不明白这将如何导致代码显着缩短。也许函数指针可能会有所帮助。你正在尝试解决什么问题? –

+0

这些都是无稽之谈的要求。将代码行作为参数传递也是类似的,是无稽之谈。你可以使用函数指针等,但不能用“保存字数限制”的理由。工程中唯一最重要的质量可能是怀疑论和质疑要求,这些要求没有任何意义。 – Lundin

+0

@Lundin这是一个非常短的'字'限制的比赛。我没有太多if语句(占用了很多我的话),每次通话可以节省> 1个字。 –

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++在做什么,可能会更好过切换到C++这是OOP和现在支持lambdas。

+1

最好是'ADD'和'SUB'应该是内联函数而不是宏。另外,这是如何在C中执行面向对象的一个​​不好的例子,因为这些结构成员显然不是私有的。 C中的私有封装是通过不透明类型/不透明指针完成的,而不是在这个例子中。 – Lundin

+0

@Lundin这是一个“成员”如何访问其他“成员”的简单例子。具有不透明指针的完整示例将涉及以类似于上述的方式创建附加的类似构造函数以及使用额外的源/头文件。 – dbush

+1

确实,但是您建议使用C++,而不是基于此示例代码。 – Lundin