2011-07-20 30 views
8

この質問は、私が最近私のRAIDデバイス用にかなり古いドライバを開いたときに現れました。 Linuxシステムのためにドライバをコンパイルできるように、私が出力に出たすべてのエラーを調べ始めました。そして私は、ドライバのソースで使用される構文のこの種に出くわした:C Struct構文の質問

struct file_operations t3_fops = { 
     owner:     THIS_MODULE, 
     ioctl:     ft_ioctl, 
     fasync:     ft_fasync, 
     open:     ft_open, 
     release:    ft_release 
}; 

のでみんなが、あなたは私が何をするかを理解するのに役立つ可能性があり「:」意味ですか?このC構文はまったくですか?私はビットフィールドの定義があることを知っていますが、これは私とは少し違って見えます。

答えて

6

構造体メンバを初期化するこの構文は、designated initializerと呼ばれます。 :は古いGCC固有の構文です。これはGCC manualに記載されています。

+0

これは正しい答えだと信じています:-)それでも質問があります。デフォルト値**はCの構造体に?構造体の定義で ':'という構文を使うことができれば、非常に便利です。 – Stan

6

これはC99構造体の初期化構文です。 owner,ioctlなどは構造体のフィールド名であり、THIS_MODULE,ft_ioctlなどは値です。これは、効果的に、コンパイル時以外、次のことをやっている:それは関係なく、構造体のフィールドの順序の初期化作業を行っているため

struct file_operations t3_fops; 
t3_fops.owner = THIS_MODULE; 
t3_fops.ioctl = ft_ioctl; 
... 

新しい構文が、いいです。

+5

標準** 6.7.8初期化**では、私は ':'構文を見ることができないので、gccの拡張だと思います。それとも内容が不足していますか?標準で構造体の初期化構文 ':'が記述されているところを教えてください。ありがとうございました! – Stan

+0

申し訳ありませんが、間違った構文を思い出しました。実際、コロンはgccの拡張であり、 '[owner] THIS_MODULE'は標準の構文です。 (私は思うのですが、私は標準の私のコピーを今アクセスすることはできません) –