将连接的文本展开为宏,然后再次展开该宏

Expand the concatenated text to be a macro and then expand the Macro again

#include <stdio.h>

#define X 2
#define N_1_T 50
#define N_2_T 49
#define PRINT() printf("id: %d", N_ ## X ## _T)

int main(void)
{
    PRINT();
    return 0;
}

我希望在拥有宏 #define X 2 时将 N_ ## X ## _T 扩展为 N_2_T。如果我将 X 的宏定义更改为 #define X 1N_ ## X ## _T 应该扩展为 N_1_T

但是我不知道该怎么做。我已经搜索并阅读了很多页面,但我就是不知道我应该怎么做才能达到预期的结果。

请帮忙,谢谢。

为了达到你想要的效果,X 宏必须在连接之前扩展为预处理器标记 2,因此包含 ## 的宏必须通过扩展2。它与此非常相似:Stringification - how does it work?

您可以使用一些强制重新扫描 pp 令牌的辅助宏来解决此问题:

#include <stdio.h>

#define X 2
#define N_1_T 50
#define N_2_T 49

#define CONCAT(n) N_ ## n ## _T
#define GET_ID(n) CONCAT(n)
#define PRINT() printf("id: %d", GET_ID(X))

int main(void)
{
    PRINT();
    return 0;
}

输出:

id: 49