Бессмысленный макрос 'MIDL_INTERFACE' в winapi? - PullRequest
2 голосов
/ 12 января 2011

После просмотра старого кода я заметил, что некоторые классы определены следующим образом:

MIDL_INTERFACE("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
Classname: public IUnknown {
    /* classmembers ... */
};

Однако макрос MIDL_INTERFACE определяется как:

#define MIDL_INTERFACE(x) struct

вC: /MinGW/include/rpcndr.h (где-то около строки 17).Сам макрос довольно очевидно совершенно бессмысленен, так какова истинная цель этого макроса?

Ответы [ 3 ]

9 голосов
/ 12 января 2011

В версии Windows SDK этот макрос расширяется до

 struct __declspec(uuid(x)) __declspec(novtable)

Первый позволяет использовать ключевое слово __uuidof, которое является хорошим способом получить guid интерфейса от typename. Второй подавляет генерацию v-таблицы, которая никогда не используется для интерфейса. Оптимизация пространства.

3 голосов
/ 12 января 2011

Это потому, что MinGW не поддерживает COM (или, скорее, поддерживает его очень плохо).MIDL_INTERFACE используется при определении компонента COM и генерируется компилятором IDL , который генерирует библиотеки типов COM и определения классов для вас.

В MSVC этот макрос обычно расширяется до большегосложная инициализация и аннотации для предоставления данного класса C ++ COM.

0 голосов
/ 12 января 2011

Если бы мне пришлось угадывать, это для одного из двух вариантов использования:

  1. Возможно, существует внешний инструмент, который анализирует файлы в поисках объявлений, подобных этим.Идея состоит в том, что, когда макрос оценивается во что-то безвредное, сам код прекрасно компилируется, но внешний инструмент все равно может смотреть на исходный код и извлекать из него информацию.

  2. Другой вариант может заключаться в том, что код использует что-то вроде X Macro Trick , чтобы выборочно переопределить то, что означает эта директива препроцессора, чтобы какой-то другой фрагмент кода мог интерпретировать данные другим способом.В зависимости от того, где находится #define, это может или не может быть возможным, но кажется разумным, что это может быть вариант использования.По сути, это особый случай первого варианта.

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