1

以下に示すように、文字列を連結する必要があるコードがあります。

#define CMD(A,B)  CMD_##A_PROMPT##B

void main()
{
    int a = 10, b = 5;
    printf("%s\n", CMD(a, b));
}

目的の出力は次のとおりです。CMD10_PROMPT5
これは何らかの手段で達成できますか?

4

2 に答える 2

3

探しているマクロはコンパイル時の「文字列化」であり、パラメーターは実行時に値を受け取るため、これができるとは思いません。

実行時の「文字列化」を探している場合は、sprintfなどを使用してください。

于 2012-06-07T08:39:49.350 に答える
1

次のものに置き換えることでそれを行うことができますint a = 10, b = 5;

#define a 10
#define b 5

そうでなければ、それは不可能です。C の翻訳は、標準で定義された一連のフェーズで行われ、オブジェクト定義が解析される前に前処理フェーズが行われます。プリプロセッサに関する限り、 tokenとint a = 10token の間に関係を確立しません。a10

出力だけを求めている場合は、次のようにします。

#define CMD_PATTERN "CMD_%d_PROMPT%d"

int main() {
    int a = 10, b = 5;
    printf(CMD_PATTERN "\n", a, b);
}

残念なことに、パターンに現れる順序と同じ順序で引数を指定する必要があります。これにより、将来順序を変更することが難しくなります。そのため、単なるパターンではなく、書式設定関数を定義した方がよい場合があります。

于 2012-06-07T08:46:13.927 に答える