Как библиотека времени выполнения C, предоставляемая компилятором, говорит, что gcc разрешает различные аргументы функций и возвращает типы: float, double, long double? - PullRequest
0 голосов
/ 03 ноября 2011

Когда я вижу man sqrt в Linux, я вижу 3 прототипа функции -

double sqrt(double x);    
float sqrtf(float x);    
long double sqrtl(long double x);

Если компилятор / библиотека написана на C ++, я понимаю, что это может быть перегрузка функций.

Если библиотека компилятора, обеспечивающая это, написана на C, как компилятор (gcc) реализует такие вещи, как перегрузка функций, которую C не поддерживает? (Или это более поздний стандарт C, такой как C99, поддерживает что-то подобное?)

На каком языке программирования реализован gcc?

Ответы [ 3 ]

5 голосов
/ 03 ноября 2011

Имена функций просто выбираются по-разному - просто sqrt для double и его друзей sqrtf и sqrtl для float и long double.Это выглядит как перегрузка, но это не так, потому что имена функций разные.

0 голосов
/ 03 ноября 2011

В C или C ++ это НЕ одинаковые функции.У вас есть отдельный вариант каждого.

В C ++ (и других языках с перегрузкой) имена каждого варианта могут быть одинаковыми, но компилятор может разделять их по типу аргументов / возвращаемых значений.(На самом деле: под капотом используется некое автоматически сгенерированное уникальное имя, которое составлено из реального имени и типов аргументов. Так что на самом деле это не одно и то же имя.)

В C именаразличаются, поэтому различие понятно программисту, компилятору и компоновщику.

0 голосов
/ 03 ноября 2011

В Windows это обычно обрабатывается с помощью #define для переименования имени функции в определенный тип в зависимости от определения

, например

#ifdef UNICODE
#define strlen wcslen
#else
#define strlen strlen
#endif
...