标识符未在宏中定义

时间:2014-08-06 09:19:35

标签: c++ macros

我正在尝试下面的程序

#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宏给我带来了麻烦。无法理解为什么编译器会这样做。

1 个答案:

答案 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(...))不起作用的问题,原因是因为宏的扩展顺序。 由于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;
}

它将输出您期望的结果。