2009-09-29 3 views
15

나는 C에 C의 ++의 구조체로 변환하지만 "선언되지 않은 식별자"를 얻고 유지하기 위해 노력하고 있어요? C++에는 구조체를 참조하는 데 다른 구문이 있습니까?C에서 구조체의 차이와 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 
}; 

I 다른 구조 내부 형 KEY_STATE의 변수를 사용하고 : 오류 C2061에

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

결과 구문 오류 : 식별자 'KEY_STATE'

을 ... 라인에 KEY_STATE kState; 차이가 나는 경우 WDK 컴파일러로 빌드 중입니다. 이것은 물론 헤더 파일에 있습니다. 나는 WDF와 C

This is the MSDN article for C2061에 C++ WDM 드라이버를 포팅하고있다.

이니셜

는 호로 수있다. 이 문제를 피하려면 선언자를 괄호로 묶거나 typedef로 만드십시오.

컴파일러가 클래스 템플릿 인수로 식을 감지 할 때이 오류도 발생할 수 있습니다; typename을 사용하여 컴파일러에 유형임을 알립니다. 구조체 형식 정의를 위해 KEY_STATE 변경

여전히이 오류가 발생합니다 실제로 더 많이 발생합니다. 너무 많은 괄호 안에 자유로운 괄호 나 사물이 없습니다. 즉, 기사에서 제안하는 다른 것입니다.

답변

30

에서 같은 일을 의미한다 C 형식의 이름은 struct KEY_STATE입니다.

그래서 당신은 당신이 형식 정의 선언 사용할 수 있습니다, 당신은 모든 시간을 struct 작성하지 않으려면

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

로 두 번째 구조체를 선언해야 KEY_STATE 유사한 DEVICE_EXTENSION에 :

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

감사합니다 Timbo, 내 문제를 해결했습니다 :) –

6

당신은 struct KEY_STATEKEY_STATE을 참조 할 필요가있다. C++에서 사용하면 일반 C.

또 다른 해결책이 유형의 별칭하는 것입니다에서 밖으로 struct,하지만 떠날 수 : 이제 KEY_STATE

typedef struct KEY_STATE KEY_STATE

struct KEY_STATE

+0

음, 그냥 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

을 당신은 '구조체'키워드 구조체 변수을 한정 :

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

DEVICE_EXTENSION을 (를) 사용하면 구조체 정의와 하나의 복합 문에서 typedef를 수행하고 있기 때문에 'struct'를 사용해야하지 않습니다. 당신이 유사한 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

는 C99에 앞서 C에는 bool 유형이 없습니다.

또한 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 감사합니다, bool은 내가 실제로 이해하지 못했던 더 많은 오류를 일으켰습니다. –

관련 문제