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 的语法。函数指针与您将要获得的一样接近。两者在语法上几乎没有区别。如果您正在寻找闭包或内部函数的行为,那么您肯定不会很快看到它们。

于 2012-04-13T18:32:04.287 回答
4

不在标准 C 中,不。Apple 引入了一个名为 blocks 的功能,可以让你做到这一点,它已经提交标准化,但它还没有(如果它能够通过的话)。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;
}

编辑
我已经重新编码示例以更便携 - 不使用 GCC 块扩展。

于 2012-04-13T21:11:47.030 回答
1

绝对不是 Objective-C 块、闭包等。但是使用函数指针呢?

于 2012-04-13T18:33:29.103 回答