Синтаксическая ошибка: отсутствует ';' перед идентификатором "PVOID64" при компиляции winnt.h

Недавно я получил исходный код приложения. Когда я пытаюсь построить решение, я получаю сообщение об ошибке во всех частях, где включен winnt.h. Коды ошибок немного отличаются, но они всегда указывают на эти строки в winnt.h:

typedef void *PVOID;
typedef void * POINTER_64 PVOID64;

и

struct {
    DWORD crc;
    BYTE  rgbReserved[14];
} CRC;

Итак, что может быть причиной этого? winnt.h является стандартным заголовком и не был изменен. Это связано со мной, используя VS 2010, или я использую 64-битные окна? или это какая-то конфигурация, которая необходима?

EDIT: Здесь указаны точные коды ошибок:

1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(290): error C2146: syntax error : missing ';' before identifier 'PVOID64'
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(290): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(8992): error C2146: syntax error : missing ';' before identifier 'Buffer'
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(8992): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(8992): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11525): error C2059: syntax error : 'constant'
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11525): error C2238: unexpected token(s) preceding ';'
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11556): error C2059: syntax error : 'constant'
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winnt.h(11556): error C2238: unexpected token(s) preceding ';'

Ответ 1

Вам нужно включить windows.h, а не winnt.h. Когда вы включите windows.h, он, в свою очередь, включит winnt.h. Вам нужно сделать это так, чтобы необходимые макросы были на месте, которые необходимы для компиляции winnt.h.

В этом случае POINTER_64 определяется в BaseTsd.h следующим образом:

#define POINTER_64 __ptr64

Но если вы включили winnt.h перед включением windows.h, то POINTER_64 не определен.

Ответ 2

Если вы используете DirectX SDK, попробуйте изменить каталоги VС++ для include и lib для поиска в последний раз.

Ответ 3

Похоже, ваша конфигурация SDK Windows недействительна. Эта ошибка вызвана тем, что компилятор не может распознать инструкцию "POINTER_64". Вы можете решить эту проблему, заменив "POINTER_64" на "__ptr64".

У меня была такая же проблема в последнее время. Затем я переустановил последнюю версию SDK Windows, и это устранило проблему.

UPDATE @David Heffernan, правильно указывает на то, что нужно включить windows.h вместо winnt.h

Ответ 5

Исправлен синтаксис вручную в winnt.h:

typedef void * POINTER_64 PVOID64; => typedef void * POINTER_64, * PVOID64;

Ответ 6

Если вы используете librdkafka, вы получите эту ошибку всякий раз, когда включается "Windows.h".

Я исправил его, переименовав "librdkafka/include/basetsd.h" на другое имя или доступ этот заголовок библиотеки через дополнительный путь!

Я думаю, что автор этой библиотеки сделал этот файл для работы с совместимостью с ОС. Но с тем же именем файла basetsd.h, что и Windows Core, это просто запутывает Visual Studio.