【问题标题】:Does C support function expressions?C 是否支持函数表达式?
【发布时间】:2012-04-13 18:29:07
【问题描述】:

是否可以在 C 中使用函数表达式?比如我有如下代码sn-p(在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 语言中可能有类似的事情吗?

【问题讨论】:

  • 不要误会我的意思,但这就是我喜欢 C++ 的原因,它以比 C 更便宜的价格为您提供了这个以及更多!
  • @AraK:价格比 C 便宜?这里的“便宜”是什么意思? C++ 的方式可能更慢,不是吗?
  • 这里更便宜意味着编译器能够折叠抽象以获得最大性能。例如,比较仿函数(或 lambda)的使用与函数指针的使用。引入别名对产生最好的代码没有多大帮助。

标签: c syntax functional-programming


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    不在标准 C 中,不。 Apple 引入了一个名为 blocks 的功能,可以让你做到这一点,并且它已被提交标准化,但它还没有(如果它能够通过的话)。 Apple 的语法如下所示:

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

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

    【讨论】:

    • 哦,听起来很有趣。好吧,只要我不能在gcc中使用它,我可能不会使用它。 :(
    • 在哪里可以找到它?它是苹果架构的 gcc C 扩展还是其他编译器?
    • @Jack:它在苹果现在不受支持的 GCC 分支中,它也在 Clang (clang.llvm.org) 中,苹果是其主要的企业赞助商。 (如果你使用 Clang,我想你会想要传递 -fblocks 标志来启用语言扩展。)
    【解决方案3】:

    你不能用普通的 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 块扩展。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-21
        • 1970-01-01
        • 2012-01-09
        • 2013-07-04
        相关资源
        最近更新 更多