c ++ - syntaksfejl: missing ';' før identifikator 'PVOID64', når der udarbejdes winnt.h

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har for nylig fået kildekoden på en applikation. Når jeg prøver at opbygge løsningen, får jeg en fejl i alle dele, hvor winnt.h er inkluderet. Fejlkoderne adskiller sig lidt, men de peger altid på disse linjer i winnt.h:


typedef void *PVOID;
typedef void * POINTER\_64 PVOID64;


og


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


Så hvad kunne være årsagen til dette? winnt.h er en standard header og er ikke blevet ændret. Har det noget at gøre med mig ved hjælp af VS 2010, eller jeg bruger 64-bit windows? eller er det en slags konfiguration, som er nødvendig?


REDIGERE:
Her er de nøjagtige fejlkoder:


1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(290): error C2146: syntax error : missing ';' before identifier 'PVOID64'
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(290): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(8992): error C2146: syntax error : missing ';' before identifier 'Buffer'
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(8992): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(8992): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(11525): error C2059: syntax error : 'constant'
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(11525): error C2238: unexpected token(s) preceding ';'
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(11556): error C2059: syntax error : 'constant'
1>C:Program Files (x86)Microsoft SDKsWindowsv7.0Aincludewinnt.h(11556): error C2238: unexpected token(s) preceding ';'

Bedste reference


Du skal inkludere windows.h i stedet for winnt.h. Når du inkludere windows.h, vil det igen omfatte winnt.h. Du skal gøre det på denne måde, for at de nødvendige makroer skal være på plads, der er nødvendige for at kompilere winnt.h.


I dette tilfælde er POINTER\_64 defineret i BaseTsd.h som denne:


#define POINTER\_64 \_\_ptr64


Men hvis du inkludere winnt.h før du indbefatter windows.h, er POINTER\_64 ikke defineret.

Andre referencer 1


Hvis du bruger DirectX SDK, skal du prøve at ændre VC ++-katalogerne for include og lib, der skal søges sidst.

Andre referencer 2


Det ser ud til, at din konfiguration af Windows SDK er ugyldig.
Denne fejl skyldes, at kompilatoren ikke er i stand til at genkende 'POINTER\_64' sætningen.
Du kan muligvis løse dette problem ved at erstatte 'POINTER\_64' med '\_\_ptr64'.


Jeg havde det samme problem for nylig. Derefter har jeg geninstalleret den nyeste version af Windows SDK, og dette løste problemet.


UPDATE
@David Heffernan peger korrekt på, at man bør inkludere windows.h i stedet for winnt.h

Andre referencer 3


Prøv at fjerne DirectX SDK, hvis du har en.


Her er bug accepteret:
http://connect.microsoft.com/VisualStudio/feedback/details/508204/vc10-0-errors-while-compiling-winnt-h[17]

Andre referencer 4


Korrigeret manuelt syntaks i winnt.h:


typedef void * POINTER\_64 PVOID64; => typedef void * POINTER\_64, * PVOID64;

Andre referencer 5


Hvis du bruger librdkafka, får du denne fejl, når 'Windows.h' er inkluderet.


Jeg fikset det ved at omdøbe 'librdkafka/include/basetsd.h' til et andet navn eller adgang
dette bibliotek header via sub path!


Jeg tror, ​​at forfatteren af ​​dette bibliotek lavede denne fil til at håndtere OS platform kompatibilitet. Men med det samme filnavn 'basetsd.h' som Windows Core, forveksler det kun Visual Studio.