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

Posted

技术标签:

【中文标题】语法错误:缺少 \';\'编译 winnt.h 时在标识符“PVOID64”之前【英文标题】:syntax error : missing ';' before identifier 'PVOID64' when compiling winnt.h语法错误:缺少 ';'编译 winnt.h 时在标识符“PVOID64”之前 【发布时间】:2012-03-29 10:32:57 【问题描述】:

我最近获得了一个应用程序的源代码。当我尝试构建解决方案时,我在包含winnt.h 的所有部分都收到错误消息。错误代码略有不同,但它们始终指向 winnt.h 中的这些行:

typedef void *PVOID;
typedef void * POINTER_64 PVOID64;

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

那么,这可能是什么原因? winnt.h 是标准头文件,未修改。是否与我使用 VS 2010 或我使用 64 位 Windows 有关?还是需要某种配置?

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

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_64BaseTsd.h 中定义如下:

#define POINTER_64 __ptr64

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

【讨论】:

即使不包括 winnt.h 也会发生这种情况,这与其他答案中提到的 Microsoft 在 DirectX SDK 中的废话有关。【参考方案2】:

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

【讨论】:

谢谢,您的回答似乎正确地解决了我的问题(编译一个针对/包含 DirectX 8.1 SDK 的项目),没有一些奇怪的建议来删除它(Serov 的回答),或者(大概)修改它的一部分(正如公认的答案似乎暗示的那样)。 实际上,我不得不做相反的事情(除非我准备好你回答不当).. 我不得不将 SDK 包含/可执行/库目录实例放在标准包含/可执行/库目录之后实例:即 ExecutableDirectories: $(ExecutablePath);C:\DXSDK\bin @BrettCaswell 指出的内容是正确的。如果您碰巧使用了属性表,那么您必须这样做才能正确包含 DirectX 目录。确保它是 $(IncludePath);$(DXSDK_DIR)Include 而不是 $(DXSDK_DIR)Include;$(IncludePath)【参考方案3】:

您的 Windows SDK 配置似乎无效。 此错误是由编译器无法识别“POINTER_64”语句引起的。 您可以通过将 'POINTER_64' 替换为 '__ptr64' 来解决此问题。

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

更新 @David Heffernan,正确地指出应该包含 windows.h 而不是 winnt.h

【讨论】:

太棒了,我从旧项目转换后出现此错误。这个和 Danil Serov 的答案都解决了我的问题!【参考方案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;

【讨论】:

typedef void * POINTER_64; typedef void * PVOID64; 如果您需要修复某些问题,您可以编辑您的帖子(您的评论看起来实际上应该是更新。)【参考方案6】:

如果您使用 librdkafka,只要包含“Windows.h”,您就会收到此错误。

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

我认为这个库的作者制作这个文件是为了处理操作系统平台的兼容性。但是使用与 Windows Core 相同的文件名“basetsd.h”,它只会混淆 Visual Studio。

【讨论】:

以上是关于语法错误:缺少 ';'编译 winnt.h 时在标识符“PVOID64”之前的主要内容,如果未能解决你的问题,请参考以下文章

OpenCVmissing ';' before identifier 'PVOID64' (转)

vs2008编译错误:error C2146: 语法错误 : 缺少“;”(在标识符“name”的前面)

winnt.h 导致更新后出现问题

VS编译错误:error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前

SQL 2005 - 表值函数编译正常,但选择时在 .. 附近抛出不正确的语法