2016-10-01 31 views
1

如何連接(或合併)兩個沒有參數且不返回任何函數的函數?在JavaScript中,我會做這樣的:將兩個函數連接成一個在C中

function f1() { 
    console.log("f1 called"); 
} 
function f2() { 
    console.log("f2 called"); 
} 
function function_concat(fa, fb) { 
    var final = function() { 
     fa(); 
     fb(); 
    }; 
    return final; 
} 
var merged = function_concat(fa, fb); 
merged(); 

在C,這是我有:

#include <stdio.h> 
#include <stdlib.h> 

typedef void (*fptr)(void); 
void f1() { 
    printf("f1 called"); 
} 
void f2() { 
    printf("f2 called"); 
} 

fptr function_concat(fa, fb) { 
    // What to do here?? 
} 
int main(int argc, const char **argv) { 
    fptr merged = function_concat(f1, f2); 
    fptr(); 
} 

我知道我必須返回一個靜態指針,但我不能定義一個函數在C函數中,如果我已經在一個函數中,很難創建新的函數。有沒有人知道一種方法來做到這一點?

+2

在C中,不能像傳遞變量等那樣傳遞函數。 JavaScript和C支持不同的編程範例。如果你堅持這樣做,你可能不得不做更多的事情。 – ray

回答

3

你也不會在C運行時定義的功能,所以你唯一的選擇是實現某種形式的代理權。您可以使用全局變量來引用函數指針,而是給一個隱含的答案,在C.

你真的不能模仿這個,如果你需要更改的fa_接口和fb_你需要再次調用function_concat,或直接設置全局變量,但此時您不需要代理功能。

static fptr fa_, fb_; 

void function_concat_proxy() { 
    fa_(); 
    fb_(); 
} 

fptr function_concat(fptr fa, fptr fb) { 
    fa_ = fp; 
    fb_ = fb; 
    return function_concat_proxy; 
} 
0

你不能在c中做到這一點。你可以做的就是打電話給你2個功能在function_concat:

void function_concat(fa, fb) { 
    fa(); 
    fb(); 
} 
1

讓我先說一句,試圖模仿一種將功能當作一等公民的語言的行爲是一種至少奇怪的要求。

另外,有一兩件事你可以創建一個類型需要兩個函數指針,然後調用一個新的typedef

typedef void (*mptr)(fptr, fptr); 

隨着function_concat看起來像:

void function_concat(fptr fa, fptr fb) { 
    fa(); 
    fb(); 
} 

main

int main(int argc, const char **argv) { 
    mptr merged = function_concat; 
    merged(f1, f2); 
} 

哪個類似現在只能通過函數指針調用function_concat(f1, f2)。顯然不是你要找的東西,但是,唉,我會留在這裏作爲參考。

+1

有趣的解決方案,但我認爲OP希望設置函數指針本身,以便返回的函數不需要傳入參數。 –

+1

啊我看到了,只是看到了你的答案,我會upvote並在這裏留下以供參考。 :-) –

+0

這符合OP代碼示例的要求。這些函數都沒有參數。如果OP有進一步的要求,那麼對於OP來說更新問題 –

相關問題