@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()を挟んで「"##"による結合より先にマクロを展開させなければいけない」ということがわかる。