#include & lt; WinUsb.h & gt; выдает ошибку компилятора в приложении MFC

У меня есть стандартное приложение 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 красным цветом.

0

Решение

Корень проблемы возникает, когда приложение настроено на использование 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 в нижней части списка, чтобы избежать непредвиденных последствий.

2

Другие решения

Вам нужно будет добавить:

#undef _MP

незадолго до включения Winusb.h,

Я полагаю, что это специфическая для MFC проблема, когда MFC определяет его как символ препроцессора, и единственный обходной путь — это специально отменить его определение, чтобы структура была записана правильно. Предположительно, у этого есть некоторые другие побочные эффекты, поэтому будьте бдительны.

1

На самом деле, моя ошибка не была # в том числе до WinUsb.h

Я сделал ошибочное предположение, что заголовки MFC в конечном итоге включали бы Windows.h, но, поскольку это приложение, связанное с устройством, очевидно, нет.

0
По вопросам рекламы [email protected]