Строковые литералы и конкатенация макросов в препроцессореC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Строковые литералы и конкатенация макросов в препроцессоре

Сообщение Anonymous »


ОКОНЧАТЕЛЬНОЕ ОБНОВЛЕНИЕ:

После прочтения множества связанных вопросов и ответов мне кажется, что ответ прост, хотя и разочаровывает: невозможно объединить строковые литералы в препроцессоре. Добавление макроса в микс ничего не меняет, а только запутывает картину.

Я удалю этот вопрос позже, если только кто-нибудь не скажет, что вышеизложенное неверно.

================

Я пытаюсь определить строковый литерал из нескольких строковых литералов и некоторых макросов.

Да, Я знаю, что соседние строковые литералы объединяются компилятором. Здесь есть сотни вопросов «как объединить строки в препроцессоре», и все они имеют практически одинаковый ответ. Но это не отвечает на главный вопрос.

Я пытаюсь сделать что-то подобное (приведенный ниже код — это всего лишь подсказка, для фактической компиляции требуется второй уровень параметризованного макроса)

#define A 1 #определить Б 2 #define STR1 "Вверх\r" #A "\r" #B "\r" #define STR2 "Вниз\r" #B "\r" #A "\r" char* strings[] = { STR1, STR2 }; В этом примере, когда я проверяю расширение макроса STR1 в IDE, я хотел бы видеть "Up\r1\r2\r", а не "Up\r" "1" "\r" "2" "\r".

ОБНОВЛЕНИЕ:

Приведенный ниже пример показывает, что IDE вполне способна отображать объединенный макрос, в этом случае расширение макроса на STR1 показывает «12». Проблемы возникают только тогда, когда я пытаюсь добавить в смесь строковые литералы.

#define CON1(a,b) a ## b #define CON2(a,b) CON1(a,b) #define STR1 CON2(A,B) Мой вопрос заключается в следующем: возможно ли объединить строки и макросы в препроцессоре, чтобы получить окончательный строковый литерал как одну непрерывную строку?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»