【问题标题】:Does C use lambda expressions?C 是否使用 lambda 表达式?
【发布时间】:2010-05-02 00:23:39
【问题描述】:

如果是这样,你如何使用它? (语法)

另外,为什么 C 支持或为什么不支持 lambda 表达式?

【问题讨论】:

    标签: c lambda


    【解决方案1】:

    不,C 不支持 lambda 表达式。

    如果您愿意使用 C++,Boost 有一个模拟 lambda 的库。此外,C++0x 将内置对 lambda 表达式的支持。

    当时 C 语言对 lambda 表达式支持的需求并不大,因此该语言不支持它。

    【讨论】:

    • ...爱你。现在我喜欢 Stack Overflow,因为它很快!
    【解决方案2】:

    C 不支持 lambda 表达式,也不支持任何其他方式(在语言标准内)动态创建函数——根据标准,所有函数都是在编译时创建的。我猜原因是为了保持语言小巧、简单、精简且非常快速,几乎不需要任何“运行时库”支持——这对于广泛用于编程操作系统、设备驱动程序、嵌入式应用程序和以此类推。

    【讨论】:

    • Lambda 表达式不需要动态创建函数。它只是创建一个引用已编译(可能是无名)函数的对象。
    • @Mike,在 C 语言中,您可以通过指针引用现有函数(实际上,提及函数名称“衰减”到指向它的指针,所以这很优雅且可行)。
    • 我认为迈克有道理。理论上,您可以在 C 中使用没有闭包的 lambda 样式语法,在表达式中定义像 x => x*x 这样的函数并评估指向该函数的指针,所有这些都不会破坏您提到的约束。只有当您希望您的 lambda 访问其周围范围时,使用仅包含代码地址的典型 C 函数指针才变得不可能。这种无上下文的函数是否应该被正确地称为“lambdas”,我不知道。
    • 现在我想知道在函数指针大于对象指针的 C 实现中可以做什么(如果有的话),以便它们可以包含正常的代码地址,也可以包含上下文指针(对于命名的 C 函数,这将是 null,并指向使用某些扩展语法定义的匿名函数的一大块堆栈)。显然,这比 C 标准想要给实现者带来的麻烦要多得多。但可能比 C++ 指向虚拟基类成员的指针更容易。
    • @Steve,Clang 在 C 中使用 blocks 支持“lambda”。请参阅 clang.llvm.org/docs/BlockLanguageSpec.txtstackoverflow.com/questions/2395040/how-do-clang-blocks-work 上的规范
    【解决方案3】:

    不,C 没有 lambda 表达式(或任何其他创建闭包的方式)。

    这很可能是因为 C 是一种低级语言,它避免了性能不佳和/或使语言或运行时系统更复杂的功能。

    【讨论】:

      【解决方案4】:

      我今天看到了这个:https://github.com/wd5gnr/clambda/blob/master/clambda2.c

      请看上面链接的代码:

      #include <stdio.h>
      
      
      float thelist[]={ 3.141, 6.02, 42.0, 0.7 };
      
      #define lambda(lambda$_ret, lambda$_args, lambda$_body)\
        ({\
          lambda$_ret lambda$__anon$ lambda$_args\
            lambda$_body\
          &lambda$__anon$;\
        })
      
      
      float average_apply(float (*fn)(float inp))
      {
          int i,n=sizeof(thelist)/sizeof(thelist[0]);
          float avg=0.0;
          for (i=0;i<n;i++)
          {
              avg+=fn(thelist[i]);
              printf("Running sum=%f\n", avg);
          }
      
          return avg/n;
      }
      
      int main(int argc, char *argv[])
      {
          printf("%f\n",average_apply(lambda(float,(float x),{ return 2*x; })));
          printf("%f\n",average_apply(lambda(float,(float x),{ return x/3.0; })));
      
          return 0;
      }
      

      并且在 gcc 中工作正常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        相关资源
        最近更新 更多