メインコンテンツへスキップ

マクロ定数からカッコを剥ぎ取る

·234 文字·
技術解説 C言語
komori-n
著者
komori-n
目次

意外とぱっと思いつかなかったので、忘れないようにメモ。

問題設定
#

次のように、カッコで値が囲まれたマクロ定数から値を取り出すマクロ関数STRIP_PRN()を作りたい。

#define A (1)

STRIP_PRN(A)  // => 1

展開したカッコつきの定数をマクロ関数の引数と解釈させると、中身を取り出すことができる。

#define STRIP_PRN(x) IDENTITY x
#define IDENTITY(x) x

これを応用すると、次のように型名が指定されたマクロ定数からも値を取り出すことができる。

#define B ((uint8_t)2)

#define DELETE_BLOCK(x) DELETE_ARG x
#define DELETE_ARG(x)

DELETE_BLOCK(STRIP_PRN(B))  // => 2

コード
#

$ gcc -E cocoro-pyonpyon2.c
# 1 "cocoro-pyonpyon2.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "cocoro-pyonpyon2.c"
# 9 "cocoro-pyonpyon2.c"
1
2

Related

値に応じて中身が変わるマクロ関数
·550 文字
技術解説 C言語
ポインタのキャストでエンディアンを意識しないとバグる例
·558 文字
技術解説 C言語