2016-10-01 22 views
1

引数をとらない関数を1つの関数に連結する方法を教えてください。 JavaScriptでは、私はこれだろう:Cで2つの関数をC言語で1つに連結する

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(); 

を、これは私が持っているものです。

#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では実行できません。あなたにできることはfunction_concatであなたの2つの機能を呼び出すことです:

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

ファーストクラスの市民として機能を扱う言語の動作をエミュレートしようとすると、少なくとも、奇妙な要求であると言います。

また、次の2つの関数ポインタを取るタイプの新しいtypedefを作成し、それを呼び出すことができます一つのこと:function_concat

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

ように見える:

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

ああ、私も見て、あなたの答えも見ました。参考のため。 :-) –

+0

これはOPのコード例の要件と一致します。関数はすべて引数をとりません。 OPにさらなる要件がある場合、OPが質問 –

関連する問題