22

我刚刚阅读了关于C11的 Wikipedia 文章,这是 2011 年 12 月发布的 C 标准的新版本,我看到其中一个新增功能是“类型通用表达式”:

_Generic使用关键字的类型通用表达式。例如,以下宏cbrt (x) 根据 x 的类型转换为cbrtl(x)cbrt(x)cbrtf(x )

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

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

4

1 回答 1

28

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

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

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

于 2012-01-11T16:12:57.610 回答