Типовые выражения C11 - почему бы просто не добавить перегрузку функций? - PullRequest
22 голосов
/ 08 января 2012

Я только что читал статью в Википедии о C11 , новой версии стандарта C, выпущенной в декабре 2011 года, и я увидел, что одной из добавленных функций были «выражения общего типа»:

Типовые выражения, использующие ключевое слово _Generic. Например, следующий макрос cbrt (x) переводится в cbrtl (x) , cbrt (x) или cbrtf (x) в зависимости от типа x :

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

Это выглядит довольно ужасно для меня - если они все равно собираются изменить язык, почему бы просто не добавить перегрузку функций, как в C ++?

1 Ответ

26 голосов
/ 11 января 2012

C имеет одно пространство имен для внешних символов и применяет ODR (одно правило определения), так что два объекта extern с одинаковыми именами в двух единицах перевода должны иметь одинаковое определение.

Хотя это возможночтобы создать C ABI, который поддерживает перегрузку, основной силой C является его простота ABI.Почти на всех платформах "ABI" - это C ABI, и он играет некоторую роль в исполнении независимо от исходного языка.Это было бы потеряно, если бы символы должны были включать информацию о типе.

TGE (как используется библиотекой) - это всего лишь управляемая вручную версия искажения имени.Он выполняет (или будет выполнять, возможно, в очень отдаленном будущем) работу, которую ему необходимо сделать, чтобы позволить объявлениям typedef управлять генерацией интенсивных по математике внутренних циклов.Люди, которым нужны возможности такого языка, как C ++, должны портировать на C ++.

...