ログ日記

作業ログと日記とメモ

C言語の##マクロを使ってみた

元ソースは
http://kurusugawa.jp/blog/archives/319/
ここ。


ただし5行目の_PersonName_を_PersonAge_に、7, 11, 15行目のaPersonをaThisに、15行目のprintAgeForをprintNameAndAgeForに、続きの方の8行目のAzusaMiurraをAzusaMiuraにそれぞれ修正する。
# こういうことをするとミスりやすいという良い例なのかもしれない


使い方はこんな感じになる。

...
int main()
{
     printNameForHarukaAmami();
     printAgeForChihayaKisaragi();
     printNameAndAgeForRitsukoAkizuki();
     return 0;
}


ただ、同じような関数を大量に定義するところがしっくりこない。構造体にまとめるのが普通だと思う。
NFSソースの#define PROCを参考にして修正したソースは以下。

#include <stdio.h>

/* 名前と年齢を格納する */
struct person {
     char name[32];
     int age;
};

/* 構造体初期化マクロ */
#define PERSON(n)             \
[PERSON_##n] = {              \
     .name = _PersonName_##n, \
     .age  = _PersonAge_##n,  \
}

/* Person構造体出力関数 */
void printName(struct person p)
{
     printf("私の名前は%sです。", p.name);
}

void printAge(struct person p)
{
     printf("私の年齢は%d才です。", p.age);
}

void printNameAndAge(struct person p)
{
     printf("私の名前は%s、年齢は%d才です。", p.name, p.age);
}

/* Person情報 */
#define PERSON_HarukaAmami 0
#define _PersonName_HarukaAmami "天海春香"
#define _PersonAge_HarukaAmami 16

#define PERSON_ChihayaKisaragi 1
#define _PersonName_ChihayaKisaragi "如月千早"
#define _PersonAge_ChihayaKisaragi 15

#define PERSON_YukihoHagiwara 2
#define _PersonName_YukihoHagiwara "萩原雪歩"
#define _PersonAge_YukihoHagiwara 16

#define PERSON_YayoiTakatsuki 3
#define _PersonName_YayoiTakatsuki "高槻やよい"
#define _PersonAge_YayoiTakatsuki 13

#define PERSON_RitsukoAkizuki 4
#define _PersonName_RitsukoAkizuki "秋月律子"
#define _PersonAge_RitsukoAkizuki 18

#define PERSON_AzusaMiura 5
#define _PersonName_AzusaMiura "三浦あずさ"
#define _PersonAge_AzusaMiura 20

#define PERSON_IoriMinase 6
#define _PersonName_IoriMinase "水瀬伊織"
#define _PersonAge_IoriMinase 14

#define PERSON_MakotoKikuchi 7
#define _PersonName_MakotoKikuchi "菊池真"
#define _PersonAge_MakotoKikuchi 16

#define PERSON_AmiFutami 8
#define _PersonName_AmiFutami "双海亜美"
#define _PersonAge_AmiFutami 12

#define PERSON_MamiFutami 9
#define _PersonName_MamiFutami "双海真美"
#define _PersonAge_MamiFutami 12

#define PERSON_MikiHoshii 10
#define _PersonName_MikiHoshii "星井美希"
#define _PersonAge_MikiHoshii 14

/* 名前、年を格納する構造体配列の定義と初期値設定 */
struct person p[] = {
     PERSON(HarukaAmami),
     PERSON(ChihayaKisaragi),
     PERSON(YukihoHagiwara),
     PERSON(YayoiTakatsuki),
     PERSON(RitsukoAkizuki),
     PERSON(AzusaMiura),
     PERSON(IoriMinase),
     PERSON(MakotoKikuchi),
     PERSON(AmiFutami),
     PERSON(MamiFutami),
     PERSON(MikiHoshii),
};


int main()
{
     printName      ( p[PERSON_HarukaAmami    ] );
     printAge       ( p[PERSON_ChihayaKisaragi] );
     printNameAndAge( p[PERSON_RitsukoAkizuki ] );

     return 0;
}

元エントリの方は何か別の理由で大量の関数が必要だったのかもしれないが、ちょっとそういう場面が思い付かなかった。