定义两个宏,如下所示:
#define MACRO_COMBINE_INNER(A,B) A##B
#define MACRO_COMBINE(A,B) MACRO_COMBINE_INNER(A,B)
我们使用这些宏
MACRO_COMBINE_INNER(ABC,__LINE__)
MACRO_COMBINE(ABC,__LINE__)
如果当前行号是123,则为 LINE == 123,为什么从两个宏扩展结果的原因是:
ABC__LINE__
ABC123
最佳答案
扩展顺序在这里起作用,首先是离群宏被扩展,然后是内部宏。在第一种情况下,扩展MACRO_COMBINE_INNER
后,您将获得:
ABC##__LINE__
变成
ABC__LINE__
,因为__LINE__
在这里不是单独的标记。在第二种情况下,预处理器扩展MACRO_COMBINE(ABC,__LINE__)
,然后__LINE__
被扩展。 ` MACRO_COMBINE_INNER(ABC,123)
然后扩展
MACRO_COMBINE_INNER
ABC##123
stringify运算符有类似的行为,需要创建这样的宏
#define STRINGIFY(x) #x
#define STRING(x) STRINGIFY(x)
为了能够在字符串文字中使用
__LINE__
:#define THROW_BAD_INDEX(x) throw std::out_of_range \
(__FILE__ ":" STRING(__LINE__) ": Bad index")
关于c++ - 宏在C++中展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946161/