2012-04-13 8 views
7

Cで関数式を使用することはできますか?例えば、私は(main関数内)次のコードスニペットがありますCは関数式をサポートしていますか?

void print_line(char *data) { 
    printf("%s\n", data); 
} 

// print all elements in my_list 
list_foreach(&my_list, print_line); 

を私の代わりにこのような何かをしたいと思います:

list_foreach(&my_list, void (char *data) { 
    printf("%s\n", data); 
}); 

はCで可能なことのようなものですか?

+0

私は間違っていませんが、それが私がC++を愛している理由です。Cよりも安い価格でこれを提供します! – AraK

+1

@AraK:Cより安い価格で?ここで「安い」とはどういう意味ですか?おそらくC++の方が遅いでしょうか? – thejh

+1

ここで値段が安いということは、コンパイラが最大限のパフォーマンスを得るために抽象化を崩壊できることを意味します。たとえば、関数ポインタを使用して、ファンクタ(またはラムダ)の使用を比較します。エイリアシングを導入しても、最高のコードを作成するのにはあまり役に立ちません。 – AraK

答えて

7

少なくとも、Javascriptのような構文ではありません。関数ポインタは、あなたが得ようとしているものに近いです。構文的には2つの違いはほとんどありません。クロージャーや内部関数の動作を探しているなら、間違いなくすぐにそれらを見るつもりはありません。

1

Objective-Cブロック、クロージャーなどのようなものはまったくありません。代わりに関数ポインタを使用するのはどうですか?

+1

これは、彼が最初のコードスニペットでやっていたことです。 – Chuck

+0

@チャックうーん...実際はい。 –

4

標準Cにはありません。 Appleはこれを可能にするブロックと呼ばれる機能を導入しました。これは標準化のために提出されましたが、それがまだ実現していない場合はまだありません。 Appleの構文は次のようになります。

list_foreach(my_list, ^(char *data) { 
    printf("%s\n", data); 
}); 

それは基本的に^(および式で戻り値の型推論のための)に置き換え*でポインタ構文を関数の。

+0

ああ、興味深いね。さて、gccで使用できない限り、おそらく私はそれを使用しません。 : – thejh

+0

アップルのアーキテクチャーや別のコンパイラのgcc拡張モジュールですか? – Jack

+0

@Jack:アップルのサポートされていないGCCフォークにあり、Clang(http://clang.llvm.org)にもあります。これは主な企業スポンサーとしてAppleを抱えています(Clangを使用する場合は、-fblocksフラグを渡して言語拡張を有効にしたいと考えています)。 – Chuck

2

あなたは行うことができないプレーンなCでただしすることができますマクロでこの偽:私はもっと移植性の例として再コーディングされました

#define FOR_EACH(type, x, array, size, code) \ 
       do { \ 
         int i; \ 
         for (i=0; i<size; ++i) { \ 
         type x = array[i]; \ 
         code \ 
         } \ 
       } while(0) 

int main() 
{ 
    int arr[] = {0,1,2,3,4,5,6}; 
    FOR_EACH(int, x, arr, 7, printf("%d ", 1 << x);); 

    return 0; 
} 

EDIT - GCCのブロックを使用せずに拡張。

関連する問題