синтаксическая ошибка: отсутствует ';'перед идентификатором 'PVOID64' при компиляции winnt.h - PullRequest
10 голосов
/ 29 марта 2012

Недавно я получил исходный код приложения. Когда я пытаюсь построить решение, я получаю сообщение об ошибке во всех частях, где 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 ';'

Ответы [ 6 ]

10 голосов
/ 29 марта 2012

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

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

#define POINTER_64 __ptr64

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

7 голосов
/ 15 апреля 2014

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

2 голосов
/ 24 октября 2012

Попробуйте удалить DirectX SDK, если он у вас есть.

Здесь ошибка принята: http://connect.microsoft.com/VisualStudio/feedback/details/508204/vc10-0-errors-while-compiling-winnt-h

2 голосов
/ 29 марта 2012

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

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

UPDATE @ Дэвид Хеффернан, правильно указывает на то, что нужно включать windows.h вместо winnt.h

1 голос
/ 10 октября 2016

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

typedef void * POINTER_64 PVOID64; => typedef void * POINTER_64, * PVOID64;
0 голосов
/ 14 декабря 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...