2015-12-15 4 views
2

Я хотел бы использовать конкатенатор препроцессора C++.Операция конкатенации препроцессора C++

#include <iostream> 
#include <string> 

#define GetBlack(colorName) (color.##colorName) 

struct Color 
{ 
    int black = 0; 
}; 

int main() 
{ 
    Color color; 
    int c = color.black; 
    int d = GetBlack(black); 
} 

Ошибки я получаю

5:35: error: pasting "." and "black" does not give a valid preprocessing token
16:11: note: in expansion of macro 'GetBlack'

C++ Shell:
http://cpp.sh/3547x

Любые советы?

ответ

9

Вы действительно не хотите здесь конкатенации. Вы просто вставив предобработки «маркер» на место, так что просто использовать:

#define GetBlack(colorName) (color.colorName) 

Макрос имя аргумента colorName расширяется на месте. Тогда

int d = GetBlack(black); 

будет расширяться в

int d = color.black; 

конкатенации для объединения двух "маркеров" вместе в одно целое, см here.

Например, если член был назван black_value, но вы просто хотели назвать GetBlack(black), макро определение было бы что-то вроде:

#define GetBlack(colourName) colour.colourName##_value; 
Смежные вопросы