使用 GCC 语句表达式的匿名函数

2024-01-12

这个问题并不是很具体;这确实是为了丰富我自己的 C 语言,我希望其他人也能发现它很有用。

免责声明:我知道很多人都会有这样的冲动:“如果你想尝试函数式编程,那么就使用函数式语言”。我在需要链接到许多其他 C 库的嵌入式环境中工作,并且没有太多空间用于许多大型共享库,并且不支持许多语言运行时。而且,动态内存分配是不可能的。我也很好奇。

我们中的许多人都见过这个漂亮的 lambda 表达式 C 宏:

#define lambda(return_type, function_body) \
({ \
      return_type __fn__ function_body \
          __fn__; \
})

一个示例用法是:

int (*max)(int, int) = lambda (int, (int x, int y) { return x > y ? x : y; });
max(4, 5); // Example

Using gcc -std=c89 -E test.c,lambda 展开为:

int (*max)(int, int) = ({ int __fn__ (int x, int y) { return x > y ? x : y; } __fn__; });

所以,这些是我的问题:

  1. 该行到底是什么整数(*X);宣布?当然,int * X;是一个指向整数的指针,但这两者有何不同?

  2. 看看展开的宏,最后的结果到底是做什么的?__fn__做?如果我写一个测试函数void test() { printf("hello"); } test;- 这会立即引发错误。我不明白那个语法。

  3. 这对于调试意味着什么? (我打算用这个和 gdb 自己进行实验,但其他人的经验或意见会很棒)。这会搞砸静态分析仪吗?


该声明(在块范围内):

int (*max)(int, int) =
    ({
    int __fn__ (int x, int y) { return x > y ? x : y; }
    __fn__;
    });

不是 C,但是有效的 GNU C。

它利用了两个gcc扩展名:

  1. 嵌套函数 http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
  2. 语句表达式 http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

Both 嵌套函数(在复合语句中定义函数)和语句表达式 (({}),基本上是一个产生值的块)在 C 中是不允许的,并且来自 GNU C。

在语句表达式中,最后一个表达式语句是构造的值。这就是为什么嵌套函数__fn__作为表达式语句出现在语句表达式的末尾。功能指示符 (__fn__表达式中的最后一个表达式语句中)通过通常的转换转换为指向函数的指针。这是用于初始化函数指针的值max.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GCC 语句表达式的匿名函数 的相关文章

随机推荐

  • 无法让预制作工作 - 过度演示

    https bitbucket org alfonse gltut downloads https bitbucket org alfonse gltut downloads 这是这本在线书中的几个教程的存储库 http www arcsy
  • Discord.py 时间表

    这就是我到目前为止所拥有的 确实适用于我想要的延迟秒数 但是如何添加时间模块或时间表模块以使其工作 以防万一我希望机器人每 24 小时发送一次消息 import discord import asyncio from discord ext
  • 什么是 git 上游

    当您创建了 github repo 并将 github repo 添加为远程时 git remote add origin https github com githubname reponame git 那么你需要推送你的第一次提交 gi
  • Firebase + 权限

    我刚刚将一款应用从 Firebase 9 0 0 更新到 Firebase 9 0 2 我使用消息 广告 compile com google firebase firebase messaging 9 0 2 compile com go
  • 将 Xml 解析为数组 (Swift)

    struct person var name var sex var age var personArray person 我的Xml字符串包含两组数据 a a
  • Bootstrap 菜单在单击时更改 li 活动类

    我通过引导程序有以下菜单 HTML div class navbar collapse collapse ul class nav navbar nav li class active a href Home Home a li li a
  • PHPExcel 导出不起作用:显示“无法访问该网站”

    我已经从服务器克隆了一个项目并安装在我的本地设置中 我正在尝试使用 PHPExcel 将 Excel 文件导出到浏览器 它在服务器中运行良好 但是本地设置有问题 我还检查了列和字段的数量 它们都很好 下面是代码
  • Rails gem Ransack -> 使用“is null”和特定值搜索“或条件”(field=x OR field IS NULL)

    我为我们的支持者制作了一个支持票系统 使用 ruby on Rails 进行编程 Ruby 1 9 3 Rails 3 2 有一个票证模型belongs to与用户 支持者 的关联 我使用 Ernie 的 gem Ransack 进行搜索
  • Intellij 尝试将 pom.xml 视为 jar 文件

    在尝试从 Intellij 运行测试 在 Maven 项目上 时 我不断收到下面提到的错误 my module Exception in parsing jar file for extract from jar path to pom x
  • WooCommerce:按产品类别划分的自定义购物车项目计数

    I found 这个脚本 https docs woothemes com document show cart contents total 这允许我在 WooCommerce 中的购物车图标上方显示购物车内容总数 a class car
  • 在 Windows 上使用 C++ 获取当前用户名

    我正在尝试创建一个程序 使用 C 在 Windows 上检索当前用户的用户名 我试过这个 char userName getenv LOGNAME stringstream ss string userNameString ss lt lt
  • 无法缩进 UITableViewCell 子类

    我对 UITableViewCell 进行了子类化 以创建带有一个按钮和 2 个标签的自定义单元格 使用 Dave Mark 的 Beginning iPhone Development 中概述的模式从 xib 加载单元格定义 这是基本代码
  • Entity Framework Core 是否支持 Union?

    我正在尝试使用 union 查询 EF Core 中的多个表 如下所示 但它不允许 请找到该查询 并附上 net core框架提供的错误提示上的图像 var query context Brand Select x gt new Brand
  • SWT 日期时间格式更改

    我正在使用 DateTime SWT 组件 它在显示时具有美国格式 mm dd yyyy 有什么方法可以将格式更改为 dd mm yyyy 吗 DateTime uses http dev eclipse org mhonarc lists
  • 使用 XPath 选择命名空间中的元素

    我想选择具有给定命名空间 前缀 的文档中最顶层的元素 更具体地说 我的 XML 文档要么以 html body 在 XHTML 命名空间中 开头 要么以特定命名空间中的多个元素之一开头 我实际上想删除 html body 并只返回正文内容或
  • jQuery 自动完成,将成功数据传递给 select 方法

    我有 json 响应 它有一些属性 我已经为列表创建了一个数组 当我单击列表项时 一些输入将由项目 ID 填充 为此 我正在考虑将完整的数据对象传递给 select 方法 然后如果单击列表中的某个项目 我将在数据对象中搜索 id 如果找到
  • beans 和 Jackson 库的问题

    HI 我正在使用 json 文件 如下所示 SourceFile videos KobeAlleyOop flv ExifTool ExifToolVersion 8 22 Warning Truncated mdat data Syste
  • 星号 (*) 在 VSCodestasks.json 中不起作用

    当我尝试运行具有多个模块的 C 项目时 它默认只编译选定的模块 我尝试编辑tasks json来编译文件夹中的每个C和头文件 但它只是将星号作为星号传递到我的命令行 我编辑了tasks json并尝试使用以下输出构建项目 Starting
  • Kotlin 的具体化类型对于 JVM 上的原语是否不正确?

    如果 Kotlin 函数调用具体化了一个原语 比如说Int 通过 类是装箱原语的类 而不是未装箱版本的类 inline fun
  • 使用 GCC 语句表达式的匿名函数

    这个问题并不是很具体 这确实是为了丰富我自己的 C 语言 我希望其他人也能发现它很有用 免责声明 我知道很多人都会有这样的冲动 如果你想尝试函数式编程 那么就使用函数式语言 我在需要链接到许多其他 C 库的嵌入式环境中工作 并且没有太多空间