2012年6月19日火曜日

マクロを文字列化する

プリプロセッサでマクロを文字列化する方法ないかな〜、って以前から思ってたんですが、 u-boot のソースコード読んでいたときに発見しました!

どういうことかといいますと #x のような文字列化機能がプリプロセッサにありますね。
例えば、以下のような感じ。


---

#include <stdio.h>

#define MK_STR(x) #x

char buf[] = "baudrate=" MK_STR(19200);

int main()
{
    puts(buf);

    return 0;
}

---

これをコンパイル、実行すると

$ ./a.out
baudrate=19200

19200"19200" のように文字列化してくれています。ここまで普通です。


やりたいことは、19200 の部分をマクロで定義しておきたいのです。

---

#include <stdio.h>

#define CONFIG_BAUDRATE 19200
#define MK_STR(x) #x

char buf[] = "baudrate=" MK_STR(CONFIG_BAUDRATE);

int main()
{
    puts(buf);

    return 0;
}

---


$ ./a.out
baudrate=CONFIG_BAUDRATE

う〜ん、残念。
CONFIG_BUADRATE19200"19200"
と置き換えてほしいんですが、 CONFIG_BAUDRATE をそのまま文字列化してくれました。

sprintf(buf, "%d", CONFIG_BAUDRATE)
みたいに sprintf は使いたくない。

で、今回見つけたやり方は以下の方法。


---

#include <stdio.h>


#define CONFIG_BAUDRATE 19200
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)

char buf[] = "baudrate=" MK_STR(CONFIG_BAUDRATE);

int main()
{
    puts(buf);

    return 0;
}

---


$ ./a.out
baudrate=19200


おぉぉ〜!うまくいった。

一見無駄にも見える
#define XMK_STR(x) #x
#define MK_STR(x) XMK_STR(x)

というマクロ定義ですが、こんな効能があるんですね。

0 件のコメント:

コメントを投稿