Почему IsEqualGUID () и "operator ==" для GUID объявлены как возвращающие int? - PullRequest
7 голосов
/ 13 июля 2010

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

Ответы [ 2 ]

7 голосов
/ 13 июля 2010

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

2 голосов
/ 13 июля 2010

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

Может быть несколько причин:

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

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

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

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

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