2012-01-07 11 views
21

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

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

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

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

+13

Возможно, потому, что для этого потребовалось бы имя mangling, а _Generic можно полностью решить во время компиляции. В любом случае, если вы серьезно относитесь к родовому программированию, вы не должны смотреть на C. –

+4

Перегрузка функций, вероятно, повлечет за собой огромную проблему совместимости в обратном направлении практически во всех реализациях (подумайте, как C runtimes/linkers/loaders обрабатывают символы) – nos

+3

@CatPlusPlus: Разрешение перегрузки для объявленных функций «inline» обеспечило бы 99% выгоды от перегрузки общей функции без каких-либо проблем с именами. Даже если кто-то хочет вызвать перегруженную функцию из других модулей, можно просто включить в файл заголовка перегруженные «встроенные» функции, которые затем будут вызывать функции с разными именами для разных типов параметров. Имена функций будут указаны в заголовочном файле, поэтому не требуется компиляция для компилятора. Были бы проблемы с этим? – supercat

ответ

26

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

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

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