0

Linuxカーネルコードで使用されている構文について疑問があります。私はそれが何をするのか直感を持っていますが、もっと正式に知りたいです。カーネルを使用していますv3.5.4

ファイル/include/linux/sched.hでは、以下が定義されています

struct task_struct {
    volatile long state;
    //some more data members
};

ファイル/include/linux/init_task.hファイルでは、以下が定義されています。

#define INIT_TASK(tsk) {
    .state     = 0,               \
    //some more initializations

}

私は2つのことについて混乱しています:

a)初期化に使用されているように感じますが、構造体のこのタイプの初期化について、誰かが良い読み物を提案できますか。

b)次の初期化がどのように機能するのかわかりません。#defineこれと対応するtask_struct構造が どのように関連しているかのように。

[編集]私は次のことにも気づきました:c)\必要なすべての行の終わりにあります。

d)カーネルdoeの多くの部分がにラップされてい#ifdef #endifます。ラップされたデータメンバーを初期化する場合は、#ifdef #endifこの形式の初期化を使用できますか。つまり、このよう#ifdef #endifに内部で使用できますかINIT_TASK()

#define INIT_TASK(tsk) {
    .state     = 0,               \

    //some more initializations
    #ifdef CX 
    .tickets   = 5,               \
    #endif

}
4

1 に答える 1

8
struct task_struct whatever = INIT_TASK(someTsk);

これにより、次のコードが生成されます。

struct task_struct whatever = { .state = 0 };

これは、構造体のフィールドを位置ではなく名前で初期化する有効な C 構文です。そうすることで、最後の位置に追加されていない構造体メンバーに対してコードが安全になります。

バックスラッシュについて: はい、マクロが次の行に続くことをプリプロセッサが認識できるようにするために必要です。

#ifdefいいえ、マクロ内では使用できません。

于 2012-10-07T12:45:28.473 に答える