7

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

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でそのようなことは可能ですか?

4

4 に答える 4

7

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

于 2012-04-13T18:32:04.287 に答える
4

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

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

これは基本的に関数ポインタ構文であり、 (および式の戻り型の推論)に*置き換えられています。^

于 2012-04-13T18:34:05.057 に答える
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ブロック拡張を使用せずに、移植性を高めるために例を再コーディングしました。

于 2012-04-13T21:11:47.030 に答える
1

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

于 2012-04-13T18:33:29.103 に答える