处理Winnt.h的奇怪的编译错误

时间:2008-11-02 18:06:44

标签: c++ c visual-studio winapi

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

MyGl.cpp
..\microsoft sdks\windows\v6.0a\include\winnt.h(964) : error C2988: unrecognizable template declaration/definition
..\microsoft sdks\windows\v6.0a\include\winnt.h(964) : error C2059: syntax error : '&'

他们指向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-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

1 个答案:

答案 0 :(得分:12)

至少有两种方法可以做到这一点。首先,只需在所有文件的顶部添加windows.h即可。只有在您需要时才包含winnt.h。但是,我觉得这有点太多了 - 我不认为需要在每个文件中都包含所有这些goo。

我所做的就是在我的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