【问题标题】:Weird compile error dealing with Winnt.h处理 Winnt.h 的奇怪编译错误
【发布时间】:2010-09-20 09:43:11
【问题描述】:

尝试通过 windows.h 编译包含 winnt.h 的文件时,出现以下错误:

MyGl.cpp
..\microsoft sdks\windows\v6.0a\include\winnt.h(964):错误 C2988:无法识别的模板声明/定义
..\microsoft sdks\windows\v6.0a\include\winnt.h(964):错误 C2059:语法错误:'&'

它们指向 Winnt.h 中的以下行

extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];

#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))

对正在发生的事情有什么想法吗?

我的编译器:

Microsoft (R) 32 位 C/C++ 优化编译器版本 15.00.21022.08 用于 80x86
版权所有 (C) 微软公司。保留所有权利。

【问题讨论】:

  • 你使用的是什么编译器版本?

标签: c++ c visual-studio winapi


【解决方案1】:

至少有两种方法可以做到这一点。第一种是在所有文件的顶部简单地包含windows.h。然后仅在需要时才包含winnt.h。但是,我觉得这有点过分了——我认为没有必要在每个文件中都包含所有这些内容。

我所做的是在我的 C/C++ 头文件的最顶部(第一件事)。

#ifndef __wtypes_h__
#include <wtypes.h>
#endif

#ifndef __WINDEF_
#include <windef.h>
#endif

这将为您提供数据类型、定义和基本的 Windows API。您可能还需要添加以下内容:

#ifndef _WINUSER_
#include <winuser.h>
#endif

#ifndef __RPC_H__
#include <rpc.h>
#endif

WinNT 有点特殊 - 如果包含上述文件对您有用,请不要包含它。如果您确实需要它,请将其包含在 wtypes.h 和 `windef.h' 之后

如果这不起作用,请检查您的包含路径和预定义的宏,看看它们是否会破坏您的构建。

问候,Foredecker

【讨论】:

  • 您刚刚节省了我的另一批工作时间。谢谢先生。
  • 这个答案的奇怪之处在于问题状态winnt.h 是通过windows.h 包含的,那么在什么情况下您需要包含winnt.h,以及这样的答案如何解决这个问题,因为它是通过windows.h 包含的?看起来你的包罗万象:检查你的包含路径和预定义的宏,看看它们是否会破坏你的构建是解决(我敢说,解决了)下划线问题的唯一原因..
  • 这个答案非常具有误导性。 wtypes.h 包括rpc.h,而windows.h 又包括windows.h。所以所有这些代码最终都与简单的#include &lt;Windows.h&gt; 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2016-01-23
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多