Из заголовка Windows:
#define DECLARE_HANDLE(name) struct name##__ {int unused;} typedef name##__* name;
И использование:
DECLARE_HANDLE(YourHandeType); // Just any name, this isn't any type
создаст новую структуру как:
struct YourHandleType__
{
int unused;
};
typedef YourHandleType__ * YourHandleType;
Где YourHandleType
будет указателем типа YourHandleType__
Оператор токенизатора ##
будет использоваться препроцессором для создания полного имени, которое будет использоваться компилятором C / C ++. В этом случае DECLARE_HANDLE
может создавать различные типы, которые будут непрозрачны для вызывающей стороны, и при этом обеспечивать «отсутствие преобразования» между различными дескрипторами.