我刚刚在阅读关于 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/