以下是一个简单的程序,它采用宏 TEST,将 _NAME 粘贴到标记的末尾,然后打印结果。
#define TEST 0
#define TEST_NAME "Joe"
#define ID_TO_NAME(id) id ## _NAME
int main(void) {
printf("%s\n", ID_TO_NAME(TEST));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是如果我引入一定程度的间接,预处理器现在使用 TEST 的值而不是标记“TEST”,导致粘贴的标记为 0_NAME 而不是 TEST_NAME。
#define TEST 0
#define TEST_NAME "Joe"
#define ID_TO_NAME(id) id ## _NAME
#define INDIRECTION(id) ID_TO_NAME(id)
int main(void) {
printf("%s\n", INDIRECTION(TEST));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以让它像第一个示例一样运行(在扩展宏之前粘贴令牌),同时保持间接性?