У меня есть стандартное приложение SDI, сгенерированное VS2010, которое я хочу использовать для тестирования WinUsb API. У меня установлена текущая версия WDK. В соответствии с сообщениями, которые я читал в другом месте, я должен иметь возможность указать путь к проекту VS2010, указывающий на WDK, и добавить для этого файл include WinUsb.h. Поэтому я добавил его в stdafx.h следующим образом
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <Winusb.h>
Но когда я компилирую, я получаю ошибки
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2332: 'struct' : missing tag name
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2011: '<unnamed-tag>' : 'enum' type redefinition
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\htmlhelp.h(331) : see declaration of '<unnamed-tag>'
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2059: syntax error : 'constant'
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
Структура, на которую она жалуется,
typedef union _USB_HIGH_SPEED_MAXPACKET {
struct _MP {
USHORT MaxPacket:11; /* 0..10 */
USHORT HSmux:2; /* 11..12 */
USHORT Reserved:3; /* 13..15 */
};
USHORT us;
} USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET;
и IDE подчеркнула _MP красным цветом.
Корень проблемы возникает, когда приложение настроено на использование MBCS.
Внутри mbctype.h
, который включается при выборе MBCS в группу #define
заявления
/* bit masks for MBCS character types */
#define _MS 0x01 /* MBCS single-byte symbol */
#define _MP 0x02 /* MBCS punct */
#define _M1 0x04 /* MBCS 1st (lead) byte */
#define _M2 0x08 /* MBCS 2nd byte*/
#define _SBUP 0x10 /* SBCS upper char */
#define _SBLOW 0x20 /* SBCS lower char */
который происходит до включения usb200.h
,
Вы можете либо не выбирать MBCS (используя Юникод), либо делать то, что говорит Линн и #undef
это на линии выше. Но место #include
в нижней части списка, чтобы избежать непредвиденных последствий.
Вам нужно будет добавить:
#undef _MP
незадолго до включения Winusb.h
,
Я полагаю, что это специфическая для MFC проблема, когда MFC определяет его как символ препроцессора, и единственный обходной путь — это специально отменить его определение, чтобы структура была записана правильно. Предположительно, у этого есть некоторые другие побочные эффекты, поэтому будьте бдительны.
На самом деле, моя ошибка не была # в том числе до WinUsb.h
Я сделал ошибочное предположение, что заголовки MFC в конечном итоге включали бы Windows.h, но, поскольку это приложение, связанное с устройством, очевидно, нет.