2012-03-29 56 views
9

Gần đây tôi đã nhận được mã nguồn trên một ứng dụng. Khi im cố gắng xây dựng giải pháp, tôi gặp lỗi ở tất cả các phần trong đó có winnt.h. Các mã lỗi khác một chút, nhưng họ luôn trỏ đến những dòng này trong winnt.h:lỗi cú pháp: thiếu ';' trước khi nhận dạng 'PVOID64' khi biên dịch winnt.h

typedef void *PVOID; 
typedef void * POINTER_64 PVOID64; 

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

Vì vậy, những gì có thể là nguyên nhân gây ra điều này? winnt.h là tiêu đề chuẩn và chưa được sửa đổi. Liệu nó có liên quan gì đến tôi khi sử dụng VS 2010 hay tôi sử dụng các cửa sổ 64-bit? hoặc là một số loại cấu hình cần thiết?

EDIT: Đây là chính xác lỗi mã:

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

Vui lòng gửi (các) lỗi chính xác – Konrad

+0

Có vẻ như đang cố gõ hai tên cùng một lúc? Khá chắc chắn đó không phải là tiêu chuẩn. – BoBTFish

+0

Đã thêm mã lỗi –

Trả lời

10

Bạn cần phải bao gồm windows.h hơn winnt.h. Khi bạn bao gồm windows.h, nó sẽ lần lượt bao gồm winnt.h. Bạn cần thực hiện theo cách này cho các macro cần thiết để có thể biên dịch winnt.h.

Trong trường hợp này, POINTER_64 được định nghĩa trong BaseTsd.h như thế này:

#define POINTER_64 __ptr64 

Nhưng nếu bạn bao gồm winnt.h trước bao gồm windows.h sau đó POINTER_64 không được định nghĩa.

2

Dường như cấu hình của Windows SDK không hợp lệ. Lỗi này là do thực tế là trình biên dịch không thể nhận ra câu lệnh 'POINTER_64'. Bạn có thể giải quyết vấn đề này bằng cách thay thế 'POINTER_64' bằng '__ptr64'.

Gần đây tôi đã gặp sự cố tương tự. Sau đó, tôi đã cài đặt lại phiên bản Windows SDK mới nhất và điều này đã khắc phục được sự cố.

CẬP NHẬT @ David Heffernan, chỉ chính xác với thực tế là người ta nên bao gồm windows.h thay vì winnt.h

+0

Tuyệt vời, tôi đã gặp lỗi này sau khi chuyển đổi từ một phiên bản cũ. Cả câu trả lời này và Danil Serov đều giải quyết được vấn đề của tôi! –

7

Nếu bạn đang sử dụng DirectX SDK, hãy thử thay đổi VC++ Thư mục cho bao gồm và lib để được tìm kiếm cuối cùng.

+0

cảm ơn, câu trả lời của bạn dường như giải quyết chính xác vấn đề của tôi (biên soạn dự án nhắm/bao gồm SDK DirectX 8.1) mà không có đề xuất lẻ nào để xóa nó (câu trả lời của Serov), hoặc (có lẽ) sửa đổi các phần của nó đề nghị). –

+1

Trên thực tế, tôi phải làm điều ngược lại (trừ khi tôi sẵn sàng trả lời không đúng) .. Tôi phải đưa các cá thể SDK bao gồm/Executable/Libraries Directory sau các cá thể Directory/Executable/Libraries Directory chuẩn: ie ** ExecutableDirectories: ** '$ (ExecutablePath); C: \ DXSDK \ bin' –

+0

Nó cũng làm việc cho tôi. –

1

Corrected tự cú pháp trong winnt.h:

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

typedef void * POINTER_64; typedef void * PVOID64; –

+0

Bạn có thể chỉnh sửa bài đăng của mình nếu bạn cần khắc phục điều gì đó (nhận xét của bạn trông giống như nội dung nào đó thực sự là bản cập nhật). – lxg

0

Nếu bạn đang sử dụng librdkafka, bạn sẽ nhận được lỗi này bất cứ khi nào "windows.h" bao gồm.

Tôi đã sửa nó bằng cách đổi tên "librdkafka/include/basetsd.h" thành tên khác hoặc truy cập tiêu đề thư viện này qua đường dẫn phụ!

Tôi cho rằng tác giả của thư viện này đã tạo tệp này để xử lý tương thích với nền tảng hệ điều hành. Nhưng với cùng một tên tập tin "basetsd.h" như Windows Core, nó chỉ gây nhầm lẫn Visual Studio.

Các vấn đề liên quan