将连接的文本展开为宏,然后再次展开该宏
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 1
,N_ ## 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
#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 1
,N_ ## 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