2012-03-29 9 views
9

Niedawno otrzymałem kod źródłowy aplikacji. Kiedy próbuję zbudować rozwiązanie, pojawia się błąd we wszystkich częściach, w których znajduje się winnt.h. Kody błędów różni się nieco, ale zawsze wskazują na tych liniach w WINNT.H:błąd składni: brakujące ";" przed identyfikatorem "PVOID64" podczas kompilacji winnt.h

typedef void *PVOID; 
typedef void * POINTER_64 PVOID64; 

i

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

Więc, co może być przyczyną tego? winnt.h jest standardowym nagłówkiem i nie został zmodyfikowany. Czy ma to coś wspólnego ze mną przy użyciu VS 2010, lub ja przy użyciu 64-bitowych okien? czy jest to jakaś konfiguracja, która jest potrzebna?

EDIT: Oto dokładny opis błędu kody:

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

Proszę podać dokładny błąd (y) – Konrad

+0

Wygląda na to, że próbuje się wpisać dwa nazwiska jednocześnie? Jestem pewien, że to nie jest standard. – BoBTFish

+0

Dodano kody błędów –

Odpowiedz

10

Trzeba to windows.h zamiast winnt.h. Jeśli podasz windows.h, będzie to z kolei obejmować winnt.h. Trzeba to zrobić w ten sposób, aby uzyskać potrzebne makra, które są potrzebne do kompilacji winnt.h.

W tym przypadku POINTER_64 jest zdefiniowana w BaseTsd.h tak:

#define POINTER_64 __ptr64 

Ale jeśli to winnt.h przed tym windows.h następnie POINTER_64 nie jest zdefiniowana.

2

Wygląda na to, że konfiguracja zestawu Windows SDK jest nieprawidłowa. Ten błąd jest spowodowany faktem, że kompilator nie może rozpoznać instrukcji "POINTER_64". Możesz obejść ten problem, zastępując "POINTER_64" przez "__ptr64".

Niedawno miałem ten sam problem. Następnie zainstalowałem najnowszą wersję zestawu Windows SDK, co rozwiązało problem.

UPDATE @David Heffernan, słusznie wskazuje na fakt, że należy zaliczyć windows.h zamiast WINNT.H

+0

Fantastyczne, mam ten błąd po konwersji ze starego proj. Zarówno ta, jak i odpowiedź Danila Serowa rozwiązują mój problem! –

7

Jeśli używasz DirectX SDK, spróbuj zmienić katalogów VC++ za to i lib do przeszukania ostatni.

+0

dziękuję, twoja odpowiedź wydaje się poprawnie rozwiązywać mój problem (kompilacja projektu, który kieruje/zawiera pakiet SDK DirectX 8.1) bez jakiejś dziwnej rekomendacji, aby go usunąć (odpowiedź Serova), lub (prawdopodobnie) modyfikować jego części (ponieważ akceptowana odpowiedź wydaje się być sugerować). –

+1

Właściwie musiałem zrobić coś odwrotnego (chyba, że ​​przygotowuję, że odpowiadasz nieprawidłowo). Musiałem umieścić SDK w katalogu/Executable/Libraries Directory instances po standardowych instancjach Include/Executable/Libraries Directory: ie ** ExecutableDirectories: ** '$ (ExecutablePath); C: \ DXSDK \ bin' –

+0

To działało również dla mnie. –

1

Poprawione ręcznie składni w WINNT.H:

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

typedef void * POINTER_64; typedef void * PVOID64; –

+0

Możesz edytować swój wpis, jeśli chcesz coś naprawić (Twój komentarz wygląda na coś, co powinno być aktualizacją). – lxg

0

Jeśli używasz librdkafka, otrzymasz ten błąd, gdy "windows.h" włączone.

Naprawiłem go, zmieniając nazwę "librdkafka/include/basetsd.h" na inną nazwę lub uzyskając dostęp do tego nagłówka biblioteki przez podścieżkę!

Myślę, że autor tej biblioteki zrobił ten plik, aby poradzić sobie ze zgodnością platformy OS. Ale z tą samą nazwą pliku "basetsd.h" jako Windows Core, po prostu mylące Visual Studio.

Powiązane problemy