以下に示すように、文字列を連結する必要があるコードがあります。
#define CMD(A,B) CMD_##A_PROMPT##B
void main()
{
int a = 10, b = 5;
printf("%s\n", CMD(a, b));
}
目的の出力は次のとおりです。CMD10_PROMPT5
これは何らかの手段で達成できますか?
以下に示すように、文字列を連結する必要があるコードがあります。
#define CMD(A,B) CMD_##A_PROMPT##B
void main()
{
int a = 10, b = 5;
printf("%s\n", CMD(a, b));
}
目的の出力は次のとおりです。CMD10_PROMPT5
これは何らかの手段で達成できますか?
探しているマクロはコンパイル時の「文字列化」であり、パラメーターは実行時に値を受け取るため、これができるとは思いません。
実行時の「文字列化」を探している場合は、sprintf
などを使用してください。
次のものに置き換えることでそれを行うことができますint a = 10, b = 5;
:
#define a 10
#define b 5
そうでなければ、それは不可能です。C の翻訳は、標準で定義された一連のフェーズで行われ、オブジェクト定義が解析される前に前処理フェーズが行われます。プリプロセッサに関する限り、 tokenとint a = 10
token の間に関係を確立しません。a
10
出力だけを求めている場合は、次のようにします。
#define CMD_PATTERN "CMD_%d_PROMPT%d"
int main() {
int a = 10, b = 5;
printf(CMD_PATTERN "\n", a, b);
}
残念なことに、パターンに現れる順序と同じ順序で引数を指定する必要があります。これにより、将来順序を変更することが難しくなります。そのため、単なるパターンではなく、書式設定関数を定義した方がよい場合があります。