语法错误:缺less';' 在编译winnt.h时标识符“PVOID64”之前

我最近得到了一个应用程序的源代码。 当我尝试构build解决scheme时,在包含winnt.h所有部分中出现错误。 错误代码有点不同,但是它们总是指向winnt.h中的这些行:

 typedef void *PVOID; typedef void * POINTER_64 PVOID64; 

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

那么,这可能是什么原因呢? winnt.h是一个标准的头文件,并没有被修改。 这与我使用VS 2010或使用64位窗口有什么关系? 还是需要某种configuration?

编辑:这是确切的错误代码:

 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 ';' 

你需要包含windows.h而不是winnt.h 。 当你包含windows.h ,它将包含winnt.h 。 您需要这样做,以便编译winnt.h所需的宏。

在这种情况下, POINTER_64BaseTsd.h是这样定义的:

 #define POINTER_64 __ptr64 

但是,如果在包含windows.h之前包含winnt.h ,则POINTER_64未定义。

如果您使用的是DirectX SDK,请尝试更改VC ++目录中的include和lib以便最后搜索。

它看起来像你的Windows SDK的配置是无效的。 这个错误是由于编译器无法识别'POINTER_64'语句而引起的。 您可以通过用'__ptr64'替换'POINTER_64'来解决这个问题。

我最近有同样的问题。 然后我重新安装了最新版本的Windows SDK,并解决了这个问题。

UPDATE @David Heffernan正确地指出了一个事实,即应该包含windows.h而不是winnt.h

尝试删除DirectX SDK,如果你有。

这里接受错误: http : //connect.microsoft.com/VisualStudio/feedback/details/508204/vc10-0-errors-while-compiling-winnt-h

在winnt.h中手动更正了语法:

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

如果你正在使用librdkafka,只要包含“Windows.h”就会得到这个错误。

我通过重命名“librdkafka / include / basetsd.h”将其修改为不同的名称,或通过子路径访问这个库头文件!

我觉得这个库的作者是这个文件来处理OS平台的兼容性。 但是与Windows Core具有相同的文件名“basetsd.h”,这只是令人困惑的Visual Studio。