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

标签 c generics overloading c11

我刚刚在阅读关于 C11 的维基百科文章, 2011 年 12 月发布的新版 C 标准,我看到其中一个新增功能是“类型泛型表达式”:

Type-generic expressions using the _Generic keyword. For example, the following macro cbrt(x) translates to cbrtl(x), cbrt(x) or cbrtf(x) depending on the type of 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++。

关于C11 类型泛型表达式 - 为什么不直接添加函数重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773992/

相关文章:

c - 为什么从结构传递指针需要额外的取消引用?

c# - 静态方法如何调用虚方法?

c - 递归添加数字序列

c - 使用 OpenSSL 将证书链从 PEM 文件加载到 STACK_OF(X509)* 中

c++ - 实现自己的 memcpy(大小以字节为单位?)

Java:枚举的不同返回类型

c# - 使用泛型在类的值类型之间进行转换

c# - 将构造函数与泛型类型定义中的对应项匹配

函数重载中的 C++ 默认参数评估一次还是每次?

javascript - 是否可以在 javascript 中创建属性?