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

HC4*_*ica 22 c generics overloading c11

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

使用_Generic关键字的类型泛型表达式.例如,下面的宏CBRT(X)转换为cbrtl(X) ,CBRT(X)cbrtf(X) 取决于类型X:

#define cbrt(X) _Generic((X), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(X)
Run Code Online (Sandbox Code Playgroud)

这看起来非常糟糕 - 如果他们要改变语言,为什么不像C++一样添加函数重载?

Pot*_*ter 26

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

尽管可以创建支持重载的C ABI,但C的主要优势在于它的ABI简单性.在几乎所有平台上,"ABI"都是C ABI,无论源语言如何,它都在执行中扮演一些角色.如果符号必须包含类型信息,则会丢失.

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