2017-01-06 5 views
0

私はWindows Driver Kit(WDK)のサンプル中の流れC言語のコードを参照してください?なぜこのCの構造体の仕事

typedef struct _COMMON_DEVICE_DATA 
{ 
    PDEVICE_OBJECT Self; 

    BOOLEAN   IsFDO; 
    ...................... 


} COMMON_DEVICE_DATA, *PCOMMON_DEVICE_DATA; 


typedef struct _PDO_DEVICE_DATA 
{ 
    COMMON_DEVICE_DATA; 

    PDEVICE_OBJECT ParentFdo; 

    ................. 

} PDO_DEVICE_DATA, *PPDO_DEVICE_DATA; 

をしかし、私はsmillarコードをテストしたい場合、それはエラーを構築します。

test.c:14:6: error: ‘AA’ has no member named ‘flag’ 
    a.flag = 1; 

fllowとしてTesingコード:

typedef struct __COMMON_DATA{  
    int flag; 
}COMMON_DATA; 

typedef struct __AA{ 
    COMMON_DATA; 
    int x; 
    int y; 
}AA; 

int main(int argc, char *argv[]) 
{ 
    AA a; 
    a.flag = 1; 
    return 0; 
} 

すべては、ウィンドウのサンプルコードと同じように見える、しかし、ここでそれは間違っていますか? AAは持っているので

+2

コードベースで予約名を使用していない(2つのアンダースコアは、大文字が続くアンダースコア) – Danh

+1

*「はすべて、ウィンドウのサンプルコードと同じように見える。」* - 一つのコードでは、使用します'a.flag'、他の(現在提供されているように)、あなたは構造体を宣言するだけです...コードは明らかに異なります。 – Holt

+1

vistualスタジオビルドを使用(ファイル拡張子はcpp)、エラー:C2039: 'flag': '__AA'のメンバーではありません。 –

答えて

0

フラグという名前のメンバーが存在しない無あなたは、構造体ではないAAの構造体

a.aa_flag.flag = 1; 
+0

はい、私はそれを知っています。しかし、私はWindowsコードが動作する理由を知りたいです –

4

で使用される構文をしてCOMMON_DATAで実際のフラグにアクセスする必要があり

typedef struct __AA{ 
    COMMON_DATA aa_flag; 
    int x; 
    int y; 
}AA; 

メンバーの名前のフラグWDKのコードサンプルは、Cでの構造継承のMicrosoftエクステンションです。しかし、エラーメッセージはgccのエラーメッセージのように見えます。

実際にgccを使用している場合は、-fms-extensionsでビルドを試すことができます。

Link to related answer

+0

サイドノート:http://softwareengineering.stackexchange.com/questions/134097/why-should-i-prefer-composition-over-inheritance。 AAはどのようにしてCOMMON_DATAになれますか?しかしCOMMON_DATAを持つかもしれません。 – user877329

+0

私はgccを使用してビルドすることも、vistualスタジオを使用することができます。私はvs2010でそれを構築しました、またエラーです。 –

+0

@ user877329私がリンクしたスレッドは、より詳細に、コメントで再ハッシュしたくありません。 –

0

あなたは-Wall -Wextra -pedanticでこれをコンパイルしている場合は、エラーの前にこの警告を見ることができます:

./struct.c:6:16: warning: declaration does not declare anything 
    COMMON_DATA; 

それがコードに変数の追加名で固定することができます。これは正常に動作します:

typedef struct __COMMON_DATA{  
    int flag; 
}COMMON_DATA; 

typedef struct __AA{ 
    COMMON_DATA cd; 
    int x; 
    int y; 
}AA; 

int main(int argc, char *argv[]) 
{ 
    AA a; 
    a.cd.flag = 1; 
    return 0; 
}