2009-09-29 78 views
15

Tôi đang cố gắng chuyển đổi cấu trúc C++ thành C nhưng tiếp tục nhận được "số nhận dạng không khai báo"? Có C + + có một cú pháp khác nhau để đề cập đến cấu trúc?Sự khác biệt giữa cấu trúc trong C và C++

struct KEY_STATE 
{ 
    bool kSHIFT; //if the shift key is pressed 
    bool kCAPSLOCK; //if the caps lock key is pressed down 
    bool kCTRL; //if the control key is pressed down 
    bool kALT; //if the alt key is pressed down 
}; 

Tôi đang sử dụng một biến kiểu KEY_STATE bên trong cấu trúc khác:

typedef struct _DEVICE_EXTENSION 
{ 
    WDFDEVICE WdfDevice; 
    KEY_STATE kState; 
} DEVICE_EXTENSION, *PDEVICE_EXTENSION; 

kết quả trong lỗi C2061: lỗi cú pháp: định danh 'KEY_STATE'

... trên dòng KEY_STATE kState; Tôi đang xây dựng với trình biên dịch WDK nếu điều đó tạo ra bất kỳ sự khác biệt nào. Đây là một tập tin tiêu đề của khóa học. Tôi đang chuyển trình điều khiển C++ WDM sang WDF và C.

This is the MSDN article for C2061.

Trình khởi tạo có thể được kèm theo dấu ngoặc đơn. Để tránh vấn đề này, kèm theo khai báo trong dấu ngoặc đơn hoặc đặt nó là typedef.

Lỗi này cũng có thể xảy ra khi trình biên dịch phát hiện biểu thức dưới dạng đối số mẫu lớp; sử dụng typename để cho trình biên dịch biết đó là một kiểu.

Thay đổi KEY_STATE thành typedef struct vẫn gây ra lỗi này và thực sự gây ra nhiều lỗi hơn. Không có dấu ngoặc đơn hay thứ gì trong quá nhiều dấu ngoặc đơn, đó là điều khác mà bài báo gợi ý.

Trả lời

30

trong C, tên của loại là struct KEY_STATE.

Vì vậy, bạn phải khai báo các cấu trúc thứ hai như

typedef struct _DEVICE_EXTENSION 
{ 
    WDFDEVICE WdfDevice; 
    struct KEY_STATE kState; 
} DEVICE_EXTENSION, *PDEVICE_EXTENSION; 

Nếu bạn không muốn viết struct tất cả các thời gian, bạn có thể sử dụng một typedef tuyên bố KEY_STATE tương tự như DEVICE_EXTENSION:

typedef struct _KEY_STATE 
{ 
    /* ... */ 
} KEY_STATE; 
+1

cảm ơn Timbo, đã giải quyết được vấn đề của tôi :) –

6

Bạn cần tham khảo KEY_STATE với struct KEY_STATE. Trong C++, bạn có thể rời khỏi struct ra, nhưng không phải trong đồng bằng C.

Một giải pháp khác là để làm một loại bí danh:

typedef struct KEY_STATE KEY_STATE

Bây giờ KEY_STATE nghĩa là điều tương tự như struct KEY_STATE

+0

Uhm, đã làm ai đó chỉ downvote tất cả các câu trả lời? Tại sao? – hrnt

+0

+1 để rõ ràng, ngắn gọn và chính xác. –

5

Bạn có thể/nên gõ vào cấu trúc để bạn không cần từ khóa struct mỗi khi bạn khai báo một biến kiểu đó.

typedef struct _KEY_STATE 
{ 
    bool kSHIFT; //if the shift key is pressed 
    bool kCAPSLOCK; //if the caps lock key is pressed down 
    bool kCTRL; //if the control key is pressed down 
    bool kALT; //if the alt key is pressed down 
} KEY_STATE; 

Bây giờ bạn có thể làm:

KEY_STATE kState; 

hoặc (như trong ví dụ bạn có):

struct KEY_STATE kState; 
4

Bạn cần phải hội đủ điều kiện một biến struct với từ khóa 'struct':

typedef struct _DEVICE_EXTENSION 
{ 
    WDFDEVICE WdfDevice; 
    struct KEY_STATE kState; 
} DEVICE_EXTENSION, *PDEVICE_EXTENSION; 

Khi bạn sử dụng DEVICE_EXTENSION bạn d on't phải sử dụng 'struct' vì bạn đang thực hiện định nghĩa struct và typedef trong một câu lệnh ghép. Vì vậy, bạn có thể làm tương tự cho KEY_STATE nếu bạn muốn sử dụng nó trong một fasion tương tự:

typedef struct _KEY_STATE_t 
{ 
    bool kSHIFT; //if the shift key is pressed 
    bool kCAPSLOCK; //if the caps lock key is pressed down 
    bool kCTRL; //if the control key is pressed down 
    bool kALT; //if the alt key is pressed down 
} KEY_STATE; 
16

Không có bool gõ C trước khi C99.

Ngoài ra, không có loại nào được gọi là KEY_STATE khi bạn làm struct KEY_STATE.

Hãy thử điều này thay vì:

typedef struct _KEY_STATE 
{ 
    unsigned kSHIFT : 1; //if the shift key is pressed 
    unsigned kCAPSLOCK : 1; //if the caps lock key is pressed down 
    unsigned kCTRL : 1; //if the control key is pressed down 
    unsigned kALT : 1; //if the alt key is pressed down 
} KEY_STATE; 
+0

+1 cảm ơn, bool đã gây ra nhiều lỗi hơn tôi đã không thực sự hiểu –

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