Почему функции Win32 API не имеют перегрузок и вместо этого не используют Ex в качестве суффикса? - PullRequest
4 голосов
/ 30 ноября 2009

В Win32 API есть, например, два метода StrFormatByteSize и StrFormatByteSizeEx. Хотя оба метода симметрично делают одно и то же, а часть счетчика Ex предлагает только новый параметр, чтобы немного изменить поведение, тогда они не могут иметь две перегрузки одной и той же функции?

Это ограничение c / c ++ или какова возможная причина такого неловкого соглашения?

Ответы [ 4 ]

26 голосов
/ 30 ноября 2009

Win32 API - это C (не C ++) API. Язык C не поддерживает перегруженные функции.

Завершите в стороне: Win32 API использует функции, декорированные __stdcall, которые включают количество байтов параметров как часть имени функции. __stdcall не является частью языка C, но компоновщики Windows должны знать об этом.

Microsoft могла бы использовать это для реализации некоторой перегрузки, но (поскольку многие языки не понимают перегрузки), это ограничило бы количество языков, которые можно использовать для программирования Windows.

11 голосов
/ 30 ноября 2009

Язык C вообще не поддерживает перегрузку функций.

2 голосов
/ 30 ноября 2009

Это ограничение c / c ++ или какова возможная причина такого неловкого соглашения?

Да, и причина того, что C не поддерживает перегрузку функций, заключается в том, что искажение имен (преобразование имен функций, используемых компоновщиком), используемое для стандарта C, не учитывает его параметры функции. То есть void func(int) в C искажается до _func поэтому вы не можете иметь func(int) и func(bool) вместе, так как оба будут преобразованы в _func.

В то время как в C ++ искаженное имя для функции учитывает все ее параметры функции, но поскольку искажение имени в C ++ не было стандартизировано, искажение имени зависит от компилятора.

Еще одна вещь, которую нужно иметь в виду, это то, что C ++ не учитывает возвращаемый параметр функции в искаженном имени. Следовательно, нельзя перегружать функции как void func(int) и bool func(int) вместе.

- Самрат Патил

0 голосов
/ 01 декабря 2009

Microsoft никогда не беспокоила.

Конечно, некоторые люди здесь говорят, что C не поддерживает перегрузку. Это не имеет значения. API уже использует перегрузку в стиле C. Например, упомянутая вами функция StrFormatByteSize действительно имеет две перегрузки: LPSTR StrFormatByteSizeA(DWORD dw, LPSTR pszBuf, UINT cchBuf) и LPWSTR StrFormatByteSizeW( LONGLONG qdw, LPWSTR pszBuf, UINT cchBuf);. Проблема этого механизма заключается в том, что он плохо обобщает различные суффиксы _Ex.

Microsoft могла бы добавить заголовок, который предоставляет StrFormatByteSize в виде двух встроенных функций C ++ вместо макросов C. Если бы они сделали это, было бы легко добавить третью перегрузку для суффикса _Ex. Однако такого заголовка C ++ не существует, и, следовательно, C ++ вообще не перегружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...