问题
I was just reading the Wikipedia article on C11, the new version of the C standard released in Dec 2011, and I saw that one of the added features was "type-generic expressions":
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)
This looks pretty horrible to me - if they are going to change the language anyways, why not just add function overloading like in C++?
回答1:
C has one namespace for external symbols, and applies the ODR (One Definition Rule) such that two extern
objects with the same name in two translation units must have the same definition.
Although it's possible to create a C ABI that supports overloading, the main strength of C is its ABI simplicity. On almost all platforms "the" ABI is the C ABI, and it plays some role in execution no matter the source language. This would be lost if symbols had to include type information.
TGE (as used by the library) is just a manually-operated version of name mangling. It does (or will do, sometime in the possibly very distant future) the job it needs to do, to allow typedef
declarations to control generation of math-intensive inner loops. People who need the features of a language like C++ should port to C++.
来源:https://stackoverflow.com/questions/8773992/c11-type-generic-expressions-why-not-just-add-function-overloading