2014-08-06 3 views
1

Я пытался ниже программуИдентификатор Не определено макросъемки

#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: 'Привет': необъявленный идентификатор

. Я не вижу, почему компилятор VS 2012 ожидает аргумент макроса или рассматривает их как идентификатор. Также макрос MKSTR работал нормально, но макрос CONCATE дает мне проблемы. Не могу понять, почему компилятор делает это.

ответ

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 

EDIT:

Так для вопроса о том, почему 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; 
} 

и он будет выводить то, что вы ожидаете.

+0

Спасибо, что я предположил, что конкатенированная строка будет напечатана также вместо определения нового макроса CONCATESTR. Я попытался сделать что-то вроде MKSTR (CONCATE (HELLO, Cpp)), любую идею, почему это не работает. –

+0

@Surfing_SO Отредактировано сейчас только для вашего нового вопроса – Kiroxas

Смежные вопросы