構造体のメンバへの値の代入

メモ。デバイスドライバのソースを眺めていると、ピリオドから始まる値への代入を組にしたマクロをよく見かける。ピリオドから始まる変数はC言語コンパイルコンパイルを通さないのであるが、構造体の要素として連続代入する時に以下のように各要素をピリオドから始まる値として表現することが出来る。

#include<stdio.h>

struct test {
  int val_a;
  int val_b;
};

int main(int argc,char **argv){

  struct test test = { .val_a = 1, .val_b = 2 };

  printf ("test.val_a=%d test.val_b=%d\n", test.val_a, test.val_b);
  return 0;
}

デバイスドライバの中ではこれを更にマクロ化して関数のような形で引数を代入する表記がよく使われる。上のコードは以下のようにマクロを使って代入することも出来る。

#include<stdio.h>

struct test {
  int val_a;
  int val_b;
};

#define TEST(a, b) \
{                  \
    .val_a = a,    \
    .val_b = b,    \
}

int main(int argc,char **argv){

  struct test test = TEST(1,2);

  printf ("test.val_a=%d test.val_b=%d\n", test.val_a, test.val_b);

  return 0;
}

It is a memo about setting values to a structure in C.