Почему IsEqualGUID () и “оператор ==” для GUID, который, как объявляют, возвратил интервал?

Функции 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 здесь?

7
задан sharptooth 13 July 2010 в 10:14
поделиться

2 ответа

Поскольку 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.

7
ответ дан 7 December 2019 в 03:10
поделиться

Есть ли причины для выбора int вместо bool?

Причин может быть несколько:

  • согласованность интерфейса между C и C ++ может быть желательна для разработчиков

  • обратная совместимость: Windows SDK сохранен (примерно) обратно совместим со времен Большого взрыва (или сразу после него). Это гарантирует, что клиентский код потребует меньше усилий для переноса на новую версию Windows и что новые версии Windows будут иметь больше базы приложений после выпуска (старые приложения, которые продолжают работать в новой Windows с минимальными усилиями).

  • использование только типов языка C может быть желательным для взаимодействия с C

  • , логический тип может не поддерживаться на некоторых платформах - например, при разработке Windows CE (я не уверен, так ли это на самом деле).

2
ответ дан 7 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: