2009-09-29 8 views
15

में संरचना के बीच अंतर मैं सी ++ स्ट्रक्चर को सी में बदलने की कोशिश कर रहा हूं लेकिन "अविकसित पहचानकर्ता" प्राप्त करना जारी रखता हूं? क्या सी ++ में structs का जिक्र करने के लिए एक अलग वाक्यविन्यास है? 'KEY_STATE'सी और सी ++

... पहचानकर्ता लाइन पर:

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 के एक चर का उपयोग कर रहा: त्रुटि C2061 में

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

परिणाम: सिंटेक्स त्रुटि KEY_STATE KState; यदि मैं कोई फर्क पड़ता हूं तो मैं डब्लूडीके कंपाइलर के साथ निर्माण कर रहा हूं। यह निश्चित रूप से एक हेडर फ़ाइल में है। मैं डब्ल्यूडीएफ और सी

This is the MSDN article for C2061 पर सी ++ डब्लूडीएम चालक को पोर्ट कर रहा हूं।

एक प्रारंभकर्ता कोष्ठक द्वारा संलग्न किया जा सकता है। इस समस्या से बचने के लिए, घोषणाकर्ता को कोष्ठक में संलग्न करें या इसे एक टाइपपीफ बनाएं।

यह त्रुटि तब भी हो सकती है जब संकलक वर्ग टेम्पलेट तर्क के रूप में अभिव्यक्ति का पता लगाता है; कंपाइलर को बताने के लिए टाइपनाम का उपयोग करें यह एक प्रकार है।

टाइपपीफ संरचना में KEY_STATE को बदलना अभी भी इस त्रुटि का कारण बनता है और वास्तव में बहुत अधिक कारण बनता है। बहुत सारे ब्रांड्स में कोई मुफ्त ब्रांड्स या चीजें नहीं हैं, यह लेख दूसरी चीज है जो लेख सुझाता है।

उत्तर

30

में वही अर्थ है सी, प्रकार का नाम struct KEY_STATE है।

तो आप के रूप में

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

दूसरा struct घोषित करने के लिए आप struct हर समय लिखने के लिए नहीं करना चाहते हैं है, तो आप एक typedef की घोषणा का उपयोग कर सकते KEY_STATE समान DEVICE_EXTENSION रहे हैं:

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

धन्यवाद टिम्बो, मेरी समस्या हल हो गई :) –

6

आपको के साथ KEY_STATE का संदर्भ लेना होगा। C++ में आप सादे सी

एक अन्य समाधान एक प्रकार उर्फ ​​करना है में struct बाहर है, लेकिन नहीं छोड़ सकते: अब KEY_STATE

typedef struct KEY_STATE KEY_STATE

struct KEY_STATE

+0

Uhm, सभी जवाब किसी बस downvote किया था? क्यूं कर? स्पष्ट, संक्षिप्त और सटीक होने के लिए – hrnt

+0

+1। –

5

आप संरचना को टाइप/डिफिड कर सकते हैं ताकि जब भी आप उस प्रकार के चर को घोषित करेंगे तो आपको स्ट्रक्चर कीवर्ड की आवश्यकता नहीं होगी।

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; 

अब आप कर सकते हैं:

KEY_STATE kState; 

या (उदाहरण के लिए आप के रूप में):

struct KEY_STATE kState; 
4

आप struct 'कीवर्ड के साथ एक struct चर अर्हता प्राप्त करने के लिए है:

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

जब आप DEVICE_EXTENSION का उपयोग करते हैं तो आप d 'स्ट्रक्चर' का उपयोग नहीं करना है क्योंकि आप एक कंपाउंड स्टेटमेंट में स्ट्रक्चर डेफिनिशन और टाइपपीफ कर रहे हैं। तो तुम अगर आप एक ऐसी ही fasion में इसका इस्तेमाल करना चाहता था KEY_STATE के लिए एक ही कर सकता है:

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

सी में कोई bool प्रकार C99 से पहले नहीं है।

इसके अलावा, struct KEY_STATE पर KEY_STATE नामक कोई भी प्रकार नहीं है।

ऐसा करें:

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 धन्यवाद, बूल एक गुच्छा और त्रुटियों का कारण बन रहा था जिसे मैं वास्तव में समझ में नहीं आया –