2012-03-29 13 views
9

Ich habe kürzlich den Quellcode einer Anwendung bekommen. Wenn ich versuche, die Lösung zu erstellen, bekomme ich einen Fehler in allen Teilen, wo winnt.h enthalten ist. Die Fehlercodes unterscheidet ein wenig, aber sie weisen immer auf diese Linien in winnt.h:Syntaxfehler: fehlende ';' vor dem Bezeichner 'PVOID64' beim Kompilieren von winnt.h

typedef void *PVOID; 
typedef void * POINTER_64 PVOID64; 

und

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

Also, was die Ursache dafür sein könnte? winnt.h ist ein Standard-Header und wurde nicht geändert. Hat es etwas damit zu tun, dass ich VS 2010 oder 64-Bit-Windows benutze? oder ist es eine Art von Konfiguration, die benötigt wird?

EDIT: Hier ist die genaue Fehlercodes:

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

Bitte den genauen Fehler posten – Konrad

+0

Sieht aus wie es versucht, zwei Namen auf einmal zu schreiben? Ziemlich sicher, das ist nicht Standard. – BoBTFish

+0

Hinzugefügt die Fehlercodes –

Antwort

10

Sie müssen windows.h statt winnt.h aufzunehmen. Wenn Sie windows.h einschließen, enthält es wiederum winnt.h. Sie müssen es auf diese Weise tun, damit die notwendigen Makros vorhanden sind, die zum Kompilieren von winnt.h benötigt werden.

In diesem Fall wird POINTER_64 in BaseTsd.h wie folgt definiert:

#define POINTER_64 __ptr64 

Aber wenn Sie winnt.h bevor einschließlich windows.h dann POINTER_64 nicht definiert sind.

2

Offenbar ist Ihre Konfiguration des Windows SDK ungültig. Dieser Fehler wird durch die Tatsache verursacht, dass der Compiler die Anweisung 'POINTER_64' nicht erkennen kann. Sie können dieses Problem umgehen, indem Sie "POINTER_64" durch "__ptr64" ersetzen.

Ich hatte das gleiche Problem in letzter Zeit. Dann habe ich die neueste Version des Windows SDK neu installiert und das Problem behoben.

UPDATE @ David Heffernan, weist zu Recht auf die Tatsache, dass man windows.h statt winnt.h

+0

Fantastisch, ich habe diesen Fehler nach einer Konvertierung von einem alten Projekt. Sowohl dies und Danil Serov Antwort löst mein Problem! –

7

Wenn Sie DirectX SDK verwenden, versuchen Sie die Verzeichnisse VC++ Wechsel für include und lib zuletzt durchsucht werden.

+0

Danke, Ihre Antwort scheint mein Problem richtig zu adressieren (ein Projekt zu kompilieren, das DirectX 8.1 SDK zum Ziel hat), ohne irgendeine merkwürdige Empfehlung, es zu entfernen (Serovs Antwort), oder (vermutlich) Teile davon zu modifizieren (wie die akzeptierte Antwort scheint) vorschlagen). –

+1

Eigentlich musste ich das Gegenteil tun (es sei denn, ich bin bereit, Sie nicht richtig zu beantworten) .. Ich musste die SDK Include/Executable/Libraries Directory-Instanzen nach dem Standard Include/Executable/Libraries Directory Instanzen: dh ** ExecutableDirectories: ** '(ExecutablePath); C: \ DXSDK \ bin' –

+0

Es funktionierte auch für mich. –

1

manuell Syntax in winnt.h Korrigiert:

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

typedef void * POINTER_64; typedef void * PVOID64; –

+0

Sie können Ihren Beitrag bearbeiten, wenn Sie etwas korrigieren müssen (Ihr Kommentar sieht aus wie etwas, das eigentlich ein Update sein sollte.) – lxg

0

Wenn Sie mit librdkafka, werden Sie diese Fehlermeldung erhalten, wenn "Windows.h" enthalten.

Ich reparierte es, indem ich "librdkafka/include/bacesd.h" zu einem anderen Namen umbenenne, oder auf diesen Bibliothekskopf über Unterpfad zugreifen!

Ich denke, der Autor dieser Bibliothek hat diese Datei gemacht, um mit OS-Plattform-Kompatibilität umzugehen. Aber mit dem gleichen Dateinamen "bacesd.h" wie Windows Core, verwirrte es nur Visual Studio.

Verwandte Themen