C是否支持函数表达式?

时间:2012-04-13 18:29:07

标签: c syntax functional-programming

是否可以在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 个答案:

答案 0 :(得分:7)

总之,不,至少不是类似Javascript的语法。函数指针与您将要获得的一样接近。两种句法上的差别很小。如果您正在寻找闭包或内部函数的行为,那么您肯定不会很快看到它们。

答案 1 :(得分:4)

不在标准C中,没有。 Apple已经推出了一个名为blocks的功能,可以让你这样做,并且它已被提交用于标准化,但它还没有(如果它能够完成)。 Apple的语法如下:

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

它基本上是函数指针语法,*替换为^(以及表达式中返回类型的推断)。

答案 2 :(得分: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块扩展。

答案 3 :(得分:1)

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