【问题标题】:Identifier Not defined in Macro标识符未在宏中定义
【发布时间】:2014-08-06 09:19:34
【问题描述】:

我正在尝试下面的程序

#include <iostream>
using namespace std;
#define MKSTR(x) #x
#define CONCATE( x , y ) (x)##(y)

int main()
{
    int xy = 100;
    cout << MKSTR(HELLO C++) << endl;
    cout << CONCATE(HELLO,C++) << endl;
    cout << CONCATE(x,y) << endl;
    return 0;
}

并得到错误

错误 C2065:“HELLO”:未声明的标识符

。我不明白为什么 VS 2012 编译器需要宏参数或将它们视为标识符。 MKSTR 宏也运行良好,但 CONCATE 宏给我带来了麻烦。无法理解为什么编译器会这样做。

【问题讨论】:

    标签: c++ macros


    【解决方案1】:

    您需要先连接符号,然后将其展开为字符串,如下所示(在GCC 4.8.1 中编译):

    #include <iostream>
    using namespace std;
    #define MKSTR(x) #x
    #define CONCATE( x , y ) x ## y
    #define CONCATESTR( x , y ) MKSTR(x ## y)
    
    int main()
    {
        int xy = 100;
        cout << MKSTR(HELLO C++) << endl;
        cout << CONCATESTR(HELLO,C++) << endl;
        cout << CONCATE(x,y) << endl;
        return 0;
    }
    

    输出:

    HELLO C++
    HELLOC++
    100
    

    编辑:

    所以对于MKSTR(CONCAT(...))为什么不起作用的问题,原因是因为宏的扩展顺序。 因为CONCATMKSTR 的参数并且MKSTR 使用运算符#,所以该参数不会展开而是立即字符串化。您可以这样做以使其正常工作:

    #include <iostream>
    using namespace std;
    #define CONCATE( x , y ) x ## y
    #define MKSTR(x) #x
    #define MKSTR2(x) MKSTR(x)
    #define CONCATESTR( x , y ) MKSTR(x ## y)
    
    int main()
    {
        int xy = 100;
        cout << MKSTR2(HELLO C++) << endl;
        cout << MKSTR2(CONCATE(HELLO,C++)) << endl;
        cout << CONCATE(x,y) << endl;
        return 0;
    }
    

    它会输出你所期望的。

    【讨论】:

    • 谢谢,我假设连接的字符串也会被打印,而不是定义一个新的宏 CONCATESTR 我试着做一些像 MKSTR(CONCATE(HELLO,Cpp)) 这样的事情,知道为什么这不起作用。跨度>
    • @Surfing_SO 刚刚为您的新问题编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多