C11 类型泛型表达式 - 为什么不直接添加函数重载?

2024-03-22

我刚刚读了维基百科的文章C11 http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29,2011年12月发布的新版本C标准,我看到新增的功能之一是“类型泛型表达式”:

类型通用表达式使用_Generic关键词。例如, 跟随宏cbrt(x)翻译为cbrtl(x), cbrt(x) or cbrtf(x)取决于类型x:

#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)

这对我来说看起来非常可怕 - 如果他们无论如何都要改变语言,为什么不像 C++ 那样添加函数重载呢?


C 有一个用于外部符号的命名空间,并应用 ODR(一个定义规则),使得两个extern两个翻译单元中具有相同名称的对象必须具有相同的定义。

尽管可以创建支持重载的 C ABI,但 C 的主要优势在于其 ABI 简单性。在几乎所有平台上,“”ABI 都是 C ABI,无论源语言是什么,它都会在执行中发挥一定作用。如果符号必须包含类型信息,则该信息将会丢失。

TGE(由库使用)只是名称修改的手动操作版本。它做了(或者将会做,在可能很遥远的未来的某个时候)它需要做的工作,以允许typedef用于控制数学密集型内部循环生成的声明。需要 C++ 等语言功能的人应该移植到 C++。

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

C11 类型泛型表达式 - 为什么不直接添加函数重载? 的相关文章

随机推荐

  • Maven - 添加集成测试

    尝试将 Maven 构建中的测试拆分为单元测试和集成测试 我正在使用故障安全插件来运行集成测试 并尝试使用 build helper maven plugin 从 src it java 目录添加集成测试 当我尝试进行构建时出现错误 但我看
  • 复制Mysql数据库的数据库结构

    我正在使用 MySql 5 1 数据库 我创建了一个项目数据库 模板数据库 并希望每次用户创建新项目时从应用程序创建同一数据库的副本 如何复制并创建相同结构的新数据库 这样做的命令是什么 如果您只想将表结构等从一个数据库复制到另一个数据库
  • WooCommerce 中的多个订单

    我想在类别页面中按平均评分 DESC 然后按价格 ASC 订购产品 id avgrating price 1 4 10 2 4 5 3 5 7 顺序 3 2 1 所以我尝试了 args meta key wc average rating
  • Flex:跨分辨率应用

    What is the best way to create applications in Flex AIR which look and feel the same irrespective of the screen resoluti
  • Django 接受一个整数到 CharField 中

    我正在学习 django 并创建了一个Page form class像这样 from django import forms class Page forms Form title forms CharField max length 20
  • 如何让我自己的 JavaScript 函数具有必需的参数?

    当我在intellij idea中编写javascript时 我可以检查我正在调用的函数的参数 它会显示类似的内容 我不确定这是否是一个 intellij 功能 它了解标准库 或者它是否是一个 javascript 功能 可以让您将参数标记
  • FabricJS 触摸平移/缩放整个画布

    我需要在 FabricJS 画布上启用触摸缩放 平移 有些库允许在图像上执行此行为 请参阅捏缩放画布 https github com vash15 pinch zoom canvas 或通过鼠标单击事件 参见这个小提琴 http jsfi
  • 如何保持每 5 秒请求一次页面而不耗尽电池电量?

    我正在开发的 Android 应用程序需要每 5 秒在我的服务器上请求一个页面 但我担心这会消耗大量电池 有没有更简单的方法 我当前的方法是每 5 秒循环一次的服务 protected void onHandleIntent Intent
  • 如何使用 extern 在 C++ 中的源文件之间共享 Globe 变量?

    IDE 代码块 13 12 main cpp include
  • python继承:使用参数选择父类

    我在设计一些课程时遇到困难 我希望我的用户能够通过传递角色类型的参数 例如战士 向导 来使用Character 类 虚拟代码 class CharClass def init self level self level level clas
  • 在 MSTest 中如何查找要在 ClassInitialize 或 AssemblyInitialize 中运行的测试总数?

    使用 MStest 我想查找排队等待运行的测试方法的总数 我应该如何捕获这个值ClassInitialize or AssemblyInitialize 方法 我唯一得到的是 TestContext 它没有测试总数的详细信息 我实际上对此有
  • 在 awk 中使用双引号[重复]

    这个问题在这里已经有答案了 该命令将打印a echo line1 a b c awk print 2 如果我将单引号更改为双引号 就像这样 它将打印整行 echo line1 a b c awk print 2 为什么 我知道我应该使用单引
  • 如何为给定模式提供关系代数?

    员工 姓名 街道 城市 作品 人名 公司名称 工资 公司 公司名称 城市 管理 人员姓名 经理姓名 查找此数据库中所有不为第一银行公司工作的员工的姓名 假设所有人都为一家公司工作 并且允许人员出现在数据库中 例如 在员工中 但不能出现在作品
  • es6模块加载是如何工作的

    我去过reading https github com systemjs systemjs about https github com systemjs systemjs ES6模块加载器 https github com ModuleL
  • 对于异步Task,为什么需要Wait()来捕获OperationCanceledException?

    我正在遵循示例代码here http msdn microsoft com en us library dd997396 aspx了解异步任务 我修改了代码以编写任务工作与主要工作的一些输出 输出将如下所示 我注意到 如果删除 Wait 调
  • 在 F# 中表示错误的最惯用方式是什么

    我正在开发 F 项目 我想知道使用返回域错误的最佳实践是什么Result输入 F 我认为有几种方法可以做到这一点 继承的异常 type DomainException message inherit Exception message ty
  • Hive 命令行 如果不是在后台执行 MapReduce 作业,则选择查询所花费的时间不正确

    我正在运行配置单元查询 如下所示 Select count group name from table name group by group name 状态 正在运行 在应用程序 ID XXXX 的 YARN 集群上执行 VERTICES
  • 将焦点更改回控制台窗口

    我对Windows编程的了解接近于零 但现在我已经制作了一个从 Windows 控制台运行的 Forth 程序 它打开一个原始的图形窗口 问题是我想通过按键来控制程序 但是当程序启动时 焦点没有在控制台窗口上 而是在图形窗口上 如何改变后焦
  • Kubeflow Pipeline 终止通知

    我尝试添加一个逻辑 当管道由于某些错误而终止时 该逻辑将发送松弛通知 我尝试用ExitHandler 但是 似乎ExitHandler不能依赖于任何操作 你有什么好主意吗 我找到了一个使用的解决方案ExitHandler 我在下面发布我的代
  • C11 类型泛型表达式 - 为什么不直接添加函数重载?

    我刚刚读了维基百科的文章C11 http en wikipedia org wiki C11 28C standard revision 29 2011年12月发布的新版本C标准 我看到新增的功能之一是 类型泛型表达式 类型通用表达式使用