2008-11-02 9 views
2

Lorsque vous essayez de compiler un fichier qui comprend winnt.h via windows.h, je reçois l'erreur suivante:erreur de compilation étrange traitant 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 : '&' 

Ils pointent vers les lignes suivantes dans 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))) 

Des idées pour quoi faire?

Mon compilateur:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved.
+0

Quelle version de quel compilateur utilisez-vous? –

Répondre

11

Il y a au moins deux façons de le faire. Le premier est d'inclure simplement windows.h en haut de tous vos fichiers. N'incluez ensuite winnt.h que si vous en avez besoin. Cependant, je trouve cela un peu trop - je ne vois pas le besoin d'inclure tout ce goo dans chaque fichier.

Ce que je fais est ce tout en haut (première chose) dans mes fichiers d'en-tête C/C++.

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

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

Ceci vous apportera les types de données, les définitions et les API Windows fondamentales. Vous pouvez aussi besoin d'ajouter ce qui suit:

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

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

WinNT est un peu d'un animal particulier - ne comprennent pas si les fichiers ci-dessus, y compris fonctionne pour vous. Si vous en avez besoin, inclure après wtypes.h et `Windef.h »

Si cela ne fonctionne pas, vérifiez les chemins d'inclusion et macros prédéfinies pour voir si ceux qui pourraient être casser votre construction.

Observe, Foredecker

+0

Vous venez d'enregistrer un autre lot d'heures de mon travail. Merci Monsieur. – AutomaticHourglass

+1

la partie impaire à propos de cette réponse est que la question indique 'winnt.h' est inclus via' windows.h', donc dans quelle condition auriez-vous besoin d'inclure 'winnt.h', et comment une telle adresse répond-elle? le problème étant donné qu'il est inclus via 'windows.h'? Il semble que votre déclaration englobe tous: ** Vérifiez vos chemins d'inclusion et les macros prédéfinies pour voir si elles pourraient casser votre construction ** est la seule raison pour laquelle cela a résolu (oserais-je dire, résolu) le problème de soulignement .. –