@weather 曇時々晴
@title あさ~
@category 生活
@s
0500充電開始、1200再起動。
@title Cの##による結合の話
@category プログラム
@s
【cc -DNAME1=hoge -DNAME2=fuga foo.c】としたときにfoo.c内部で【MAKEFUNCNAME(niya)でhoge_fuga_niyaという関数名に展開させる】ためのマクロ記法」でかなり悩んだり。
@qcode
#define MAKEFUNCNAME2(a,b) a##_##b
#define MAKEFUNCNAME1(a,b) MAKEFUNCNAME2(a,b)
#define MAKEFUNCNAME(a) MAKEFUNCNAME1(MAKEFUNCNAME1(NAME1,NAME2),a)
@s
でいい模様。MAKEFUNCNAME(niya)とすると、以下のように展開される。
@ol
MAKEFUNCNAME1(MAKEFUNCNAME1(NAME1,NAME2),a)
MAKEFUNCNAME1(MAKEFUNCNAME2(hoge,fuga),a)
MAKEFUNCNAME1(hoge##_##fuga,a)
MAKEFUNCNAME1(hoge_fuga,a)
MAKEFUNCNAME2(hoge_fuga,niya)
hoge_fuga##_##niya
hoge_fuga_niya
@s
「Cの"##"による結合はマクロの展開より先に行われる」という理屈がわかれば、MAKEFUNCNAME1()を挟んで「"##"による結合より先にマクロを展開させなければいけない」ということがわかる。