15

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
};

別の構造内でタイプ KEY_STATE の変数を使用しています。

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

エラー C2061が発生し ます: 構文エラー: 識別子 'KEY_STATE'

...行KEY_STATE kState; それが違いを生む場合、私はWDKコンパイラで構築しています。もちろん、これはヘッダーファイルにあります。C++ WDM ドライバーを WDF と C に移植しています。

これは C2061 の MSDN 記事です

初期化子は括弧で囲むことができます。この問題を回避するには、宣言子を括弧で囲むか、typedef にします。

このエラーは、コンパイラが式をクラス テンプレート引数として検出した場合にも発生する可能性があります。typename を使用して、それが型であることをコンパイラに伝えます。

KEY_STATE を typedef 構造体に変更しても、このエラーが発生し、実際にはさらに多くのエラーが発生します。自由な括弧や、括弧が多すぎるものはありません。これは、この記事が示唆するもう 1 つのことです。

4

5 に答える 5

30

C では、型の名前はstruct KEY_STATE.

したがって、2番目の構造体を次のように宣言する必要があります

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

常に書き込みたくない場合は、次のようなstructtypedef 宣言を使用できます。KEY_STATEDEVICE_EXTENSION

typedef struct _KEY_STATE
{
    /* ... */
} KEY_STATE;
于 2009-09-29T14:02:44.150 に答える
16

boolC99 より前の C には型がありません。

また、KEY_STATE実行時に呼び出される型はありませんstruct 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;
于 2009-09-29T14:10:22.613 に答える
6

KEY_STATEで参照する必要がありますstruct KEY_STATE。C++ ではstructout を省略できますが、プレーン C では省略できません。

別の解決策は、型エイリアスを行うことです。

typedef struct KEY_STATE KEY_STATE

KEY_STATEと同じことを意味しますstruct KEY_STATE

于 2009-09-29T14:02:34.807 に答える
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;
于 2009-09-29T14:05:49.013 に答える
4

「struct」キーワードで構造体変数を修飾する必要があります。

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

DEVICE_EXTENSION を使用する場合、単一の複合ステートメントで構造体定義と typedef を実行しているため、'struct' を使用する必要はありません。したがって、同様の方法で使用したい場合は、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;
于 2009-09-29T14:06:54.800 に答える