Navigation Log - なびろぐ -
2011/11/08

...X680x0 spirit inside...

この日記はGNSで生成しています。
この日記の画像はOPTPiX webDesigner Ver.4で生成しています。

hauN
Go amazon.co.jp

■ご注文リストから■ [一覧]
■Amazonギフト券■ [購入]
玄人志向 セレクトシリーズ mSATA SSD SATA変換アダプター KRHK-MSATA/S7 []
玄人志向 セレクトシ...
Amazonほしい物リスト


2011/11/08 (火) 曇時々晴

Cの##による結合の話 (プログラム)

_ 【cc -DNAME1=hoge -DNAME2=fuga foo.c】としたときにfoo.c内部で【MAKEFUNCNAME(niya)でhoge_fuga_niyaという関数名に展開させる】ためのマクロ記法」でかなり悩んだり。


#define MAKEFUNCNAME2(a,b) a##_##b
#define MAKEFUNCNAME1(a,b) MAKEFUNCNAME2(a,b)
#define MAKEFUNCNAME(a) MAKEFUNCNAME1(MAKEFUNCNAME1(NAME1,NAME2),a)

_ でいい模様。MAKEFUNCNAME(niya)とすると、以下のように展開される。

  1. MAKEFUNCNAME1(MAKEFUNCNAME1(NAME1,NAME2),a)
  2. MAKEFUNCNAME1(MAKEFUNCNAME2(hoge,fuga),a)
  3. MAKEFUNCNAME1(hoge##_##fuga,a)
  4. MAKEFUNCNAME1(hoge_fuga,a)
  5. MAKEFUNCNAME2(hoge_fuga,niya)
  6. hoge_fuga##_##niya
  7. hoge_fuga_niya

_ 「Cの"##"による結合はマクロの展開より先に行われる」という理屈がわかれば、MAKEFUNCNAME1()を挟んで「"##"による結合より先にマクロを展開させなければいけない」ということがわかる。


[URL] [View Log()] [Trackback]
Name: Comment:



メールはこちらへ...[後藤浩昭 / Hiroaki GOTO / GORRY / gorry@hauN.org]

「表紙へ戻る」
「会議室」 「最新版」 「なびろぐindex」 「GNSソースを読む」