我正在尝试下面的程序
#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(...))
不起作用的问题,原因是由于宏的扩展顺序。因为
CONCAT
是MKSTR
的参数,并且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;
}
它将输出您的期望。