Получение макроса для concat AND stringify

Подход к конкатенации в C/С++ в макросе препроцессора должен использовать ##. Подход к stringify заключается в использовании #. Я пытаюсь выполнить и стягивать. Это генерирует предупреждение из g++ (3.3.2)

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y) // concat
#define TOKENPASTE3(x, y) TOKENPASTE(#x, #y) // concat-stringify (warnings)
const char* s = TOKENPASTE3(Hi, There)

Недопустимо получить предупреждение

"test_utils/test_registration.h: 34: 38: предупреждение: вставка" "Привет" и "Там" "не дает допустимого токена предварительной обработки"

хотя (с использованием опции -E) я вижу, что он генерирует:

const char* s = "Hi""There";

Который выглядит правильно для меня.

Любая помощь будет оценена.

1 ответ

Препроцессор уже конкатенирует смежные строковые литералы. Таким образом, ваш макрос не нужен. Пример:

#define TOKENPASTE3(x, y) #x #y
const char* s = TOKENPASTE3(Hi, There);

становится "Hi" "There". Однако, если вы хотите придерживаться своего подхода, вам нужно использовать дополнительный уровень косвенности для макроса, расширяя свой новый токен:

#define STRINGIFY(x) #x
#define TOKENPASTE(x, y) STRINGIFY(x ## y)

становится "HiThere".

licensed under cc by-sa 3.0 with attribution.