使用 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 语句表达式的匿名函数 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • GCC 如何运行其他程序?

    也许标题并没有那么准确地表达问题 我知道当我跑步时gcc foo cGCC 调用其他为其完成所有工作的子程序 使 gcc 主程序只是一个接口 但这到底是如何完成的呢 是否使用system or exec或者其他一些功能 我之所以想知道这个是
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

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

    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 库的嵌入式环境中工作 并且没有太多空间