【问题标题】:Using a macro expansion as part of an identifier [duplicate]使用宏扩展作为标识符的一部分[重复]
【发布时间】:2018-02-09 21:09:42
【问题描述】:

考虑以下代码:

struct S {};

#define CREATE_INSTANCE S instance_##__LINE__

int main()
{
    CREATE_INSTANCE;
    CREATE_INSTANCE;
    return 0;
}

我希望它创建两个名为 instance_7instance_8S 实例。它实际上做的是两次创建instance___LINE__

如何实现我想要的?

【问题讨论】:

    标签: c++


    【解决方案1】:

    使用一些间接性:

    #define Concat_(a, b) a ## b
    #define Concat(a, b) Concat_(a, b)
    #define CREATE_INSTANCE S Concat(instance_, __LINE__)
    

    【讨论】:

    • 有趣!你是说宏是在其他宏参数的上下文中扩展的,而不是在我在这里使用它的上下文中?
    • @VioletGiraffe 请记住,cpp 实际上是一次通过
    • 我仍然不明白为什么需要双重间接......
    • @user0042: 但是宏不应该在其他宏的扩展中扩展吗?
    • @Violet 不,这样的事情没有宏实际上是无法解决的。
    最近更新 更多