Синтаксическая ошибка: отсутствует ';' перед идентификатором "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
Ответ 4
Попробуйте удалить DirectX SDK, если у вас есть.
Здесь ошибка принимается:
http://connect.microsoft.com/VisualStudio/feedback/details/508204/vc10-0-errors-while-compiling-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.