我正在尝试下面的程序
#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
宏给我带来了麻烦。无法理解为什么编译器会这样做。
答案 0 :(得分: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(...))
不起作用的问题,原因是因为宏的扩展顺序。
由于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;
}
它将输出您期望的结果。