どういうことかといいますと #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
baudrate=19200
19200 → "19200" のように文字列化してくれています。ここまで普通です。
やりたいことは、19200 の部分をマクロで定義しておきたいのです。
---
#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
baudrate=CONFIG_BAUDRATE
う〜ん、残念。
CONFIG_BUADRATE → 19200 → "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)
#define MK_STR(x) XMK_STR(x)
というマクロ定義ですが、こんな効能があるんですね。
0 件のコメント:
コメントを投稿