2015-12-20 2 views
1

Итак, я изучаю C++ уже несколько месяцев, и я столкнулся с странным явлением с моей IDE. (Jetbrains CLion FTW!)Getter for Windows handles

My IDE может генерировать геттеры для членов, автоматически определяя тип, const или нет и другие ключевые слова. Очевидно, что генерация не идеальна, поэтому я обычно не использую эту функцию. Поэтому на данный момент я сосредоточен на Windows API, который требует работы с ручками. Так что что-то действительно странное происходит, когда я генерирую getter для дескриптора (HINSTANCE, HWND, HDC и т. Д.).

Say Я член определяется следующим образом:

HDC m_hDeviceContext; 

Тогда, когда мой IDE генерирует поглотитель это выглядит примерно так:

const HDC__* getDeviceContext() const... 

Я так растерялся, почему тип HDC__. Имеет смысл, что это указатель, поэтому дескриптор объявляется как указатель (typedef struct name ## __ * name) в winnt.h.

Может ли кто-нибудь дать мне некоторое представление о том, почему это происходит? Это ошибка с моей IDE, потому что всякий раз, когда я вижу примеры getters, которые возвращают дескриптор, они обычно просто возвращают этот тип дескриптора.

+0

Это похоже на ошибку с вашей IDE. Или, может быть, где-то здесь. Или, по крайней мере, дефект дизайна (если это не настройка). – immibis

+0

Вы, вероятно, правы, CLion довольно новый. Что он должен генерировать? – oliveryas01

+3

Я бы ожидал, что он будет генерировать 'HDC getDeviceContext() const {return m_hDeviceContext;}', конечно. – immibis

ответ

2

HDC определяется как typedef для непрозрачного struct указателя:

typedef const struct HDC__ *HDC; 

или в старой версии Windows, как фиктивный тип расширен с DECLARE_HANDLE(HDC):

typedef struct HDC__{int i;}*HDC; 

Цель, если это определение является предотвратите путаницу между различными типами дескрипторов, которые были бы всего целыми, если typedef ed как WORD или LONG, или DWORD. Предоставление им указателей на разные структуры предотвращает компиляцию в случае несоответствий. Microsoft делает это не менее 20 лет.

Возможно, ваша IDE ищет информацию об отладке вместо разбора файлов заголовков и не отменяет эффект typedef.

В C++, struct теги неявно typedef ed в текущем пространстве имен. Таким образом, struct HDC__ также создает тип HDC__. По какой-то причине ваша IDE предполагает это. Если вы компилируете C++, это не должно быть проблемой. Если вы компилируете C, слишком плохо, эта ошибка, вероятно, будет наименее из ваших проблем.

+0

Я не думаю, что он смотрит на отладочную информацию, возможно, это просто расширение typedef. –

+0

@MatteoItalia: расширение typedef из '' источник требует большой работы, близкой к полному грамматическому C или C++ парсеру, не говоря уже о нестандартных расширениях MS. Я был бы удивлен, если бы они это сделали. Гораздо проще скомпилировать источник «на лету» и проанализировать информацию об отладке. Истина заключается в том, что все это не требуется: определение члена - это все, что необходимо для создания обертки в этом случае. – chqrlie

+0

Мне любопытно, почему они определили эту структуру. Указатель на неполный тип - более строгая сущность. Вы даже не можете добавить нуль к такому указателю. –