2017-10-12 61 views
3

我正在研究一個項目,其中我對相當嚴格的字數限制(我不是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個字。 –

回答

7

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