我正在尝试下面的程序

#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;
}

并得到错误



。我看不出为什么VS 2012编译器期望宏参数或将其视为标识符。另外MKSTR宏也可以正常工作,但是CONCATE宏给我带来了麻烦。无法理解为什么编译器会这样做。

最佳答案

您需要先连接符号,然后将其扩展为字符串,如下所示(在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;
}

它将输出您的期望。

09-25 21:22