如何将宏的定义作为字符串文字?

时间:2015-01-08 16:36:39

标签: c++ c c-preprocessor

在标题中说,我不想自己读,但我确实包括,我有

#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

2 个答案:

答案 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