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++在做什麼,可能會更好過切換到C++這是OOP和現在支持lambdas。
你不能在C中做到這一點,我不明白這將如何導致代碼顯着縮短。也許函數指針可能會有所幫助。你正在嘗試解決什麼問題? –
這些都是無稽之談的要求。將代碼行作爲參數傳遞也是類似的,是無稽之談。你可以使用函數指針等,但不能用「保存字數限制」的理由。工程中唯一最重要的質量可能是懷疑論和質疑要求,這些要求沒有任何意義。 – Lundin
@Lundin這是一個非常短的'字'限制的比賽。我沒有太多if語句(佔用了很多我的話),每次通話可以節省> 1個字。 –