在标题中说,我不想自己读,但我确实包括,我有
#define A B
#define B C
现在
#define STR(name) # name
定义了一个宏,它将任何宏的名称作为字符串和
#define EXP_STR(name) STR(name)
定义了一个宏,它可以将任何宏的完全扩展作为字符串。所以
cout << STR(A) << EXP_STR(A) << endl;
将打印AC
。
有没有办法从"B"
使用某些宏获取A
?
答案 0 :(得分:1)
既然你可以写
#define B C
#define A B
#define STR(name) # name
#define EXP_STR(name) STR(name)
和
cout << STR(A) << EXP_STR(A) << endl;
将输出exaclty相同,这意味着它是不可能的。
当你这样做时
#define A B
然后
#define B C
现在这意味着A
将被C
而非B
取代,因此无法做到这一点,因为当到达cout
行时预处理器已经用A
替换了C
。
所以简短的回答是,不可能因为在编译文件之前预处理器会用A
替换C
。
答案 1 :(得分:0)
#undef B
之前#define EXP_STR
例如:
#define A B
#define B C
#define _TEMP_VAR B // so that it can be redefined later
#undef B // so that EXP_STR(A) will return "B"
#define EXP_STR__(x) (x)
#define EXP_STR_(x) EXP_STR__(#x)
#define EXP_STR(x) EXP_STR_(x)
#define STR(x) # x
#define B _TEMP_VAR // now you can still access A normally, defined to B (defined to C)
一个证明它的测试程序:
#include <stdio.h>
int main(void)
{
printf( "EXP_STR(A) = %s\n", EXP_STR(A) );
printf( "STR(A) = %s\n", STR(A) );
}
输出:
EXP_STR(A) = B
STR(A) = A