Функции Windows SDK IsEqualGUID () функционируют и operator==()
для двух GUID тот возврат BOOL
(эквивалентный int
):
// Guiddef.h
#ifdef __cplusplus
__inline int IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
{
return !memcmp(&rguid1, &rguid2, sizeof(GUID));
}
#else // ! __cplusplus
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
#endif
//also in Guiidef.h
#ifdef __cplusplus
__inline int operator==(REFGUID guidOne, REFGUID guidOther)
{
return IsEqualGUID(guidOne,guidOther);
}
#endif
Какой смысл этого int
? Я понимаю, что C не имеет bool
тип данных, но существует #ifdef __cplusplus
вокруг, таким образом, этот код будет только скомпилирован как C++, таким образом, bool
будет поддерживаться так или иначе. Наличие отрицания рядом memcmp()
эффективно преобразовывает все возможные значения, возвращенные от memcmp()
в нуль и ненулевой.
Также нет никаких пользовательских операторов в C - только C++ поддерживает их. Так operator==
не скомпилировал бы в коде C так или иначе.
Есть ли любые причины выбора int
вместо bool
здесь?
Поскольку Windows API раскрывает IsEqualGUID()
как функцию, возвращающую BOOL
. Они должны поддерживать стабильный интерфейс. BOOL
и bool
- это разные величины, а Windows API разработан для совместимости с различными языками и компиляторами. Помните, что существуют и другие языки, кроме C++, которые взаимодействуют с Windows API.
На C и C++, IsEqualGUID()
реализована в терминах memcmp()
, но IsEqualGUID()
также реализована в ole32.dll
. Вы можете получить функцию из ole32.dll
:
REFGUID guid1 = IID_IUnknown;
REFGUID guid2 = IID_AsyncIUnknown;
typedef BOOL (WINAPI *IsEqualGUIDFuncType)(REFGUID, REFGUID);
HMODULE h = ::LoadLibrary("ole32.dll");
IsEqualGUIDFuncType f = reinterpret_cast<IsEqualGUIDFuncType>
(::GetProcAddress(h, "IsEqualGUID"));
if(f != NULL)
{
if(f(guid1, guid2) != 0)
::printf("true\n");
else
::printf("false\n");
}
::FreeLibrary(h);
Таким образом, несмотря на то, что в C++ она реализована как встроенная функция, другие языки могут использовать DLL-реализацию IsEqualGUID()
. Версия на C++ возвращает BOOL
, поэтому она соответствует API.
Есть ли причины для выбора int вместо bool?
Причин может быть несколько:
согласованность интерфейса между C и C ++ может быть желательна для разработчиков
обратная совместимость: Windows SDK сохранен (примерно) обратно совместим со времен Большого взрыва (или сразу после него). Это гарантирует, что клиентский код потребует меньше усилий для переноса на новую версию Windows и что новые версии Windows будут иметь больше базы приложений после выпуска (старые приложения, которые продолжают работать в новой Windows с минимальными усилиями).
использование только типов языка C может быть желательным для взаимодействия с C
, логический тип может не поддерживаться на некоторых платформах - например, при разработке Windows CE (я не уверен, так ли это на самом деле).