Строковые литералы и конкатенация макросов в препроцессоре ⇐ C++
-
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) Мой вопрос заключается в следующем: возможно ли объединить строки и макросы в препроцессоре, чтобы получить окончательный строковый литерал как одну непрерывную строку?
ОКОНЧАТЕЛЬНОЕ ОБНОВЛЕНИЕ:
После прочтения множества связанных вопросов и ответов мне кажется, что ответ прост, хотя и разочаровывает: невозможно объединить строковые литералы в препроцессоре. Добавление макроса в микс ничего не меняет, а только запутывает картину.
Я удалю этот вопрос позже, если только кто-нибудь не скажет, что вышеизложенное неверно.
================
Я пытаюсь определить строковый литерал из нескольких строковых литералов и некоторых макросов.
Да, Я знаю, что соседние строковые литералы объединяются компилятором. Здесь есть сотни вопросов «как объединить строки в препроцессоре», и все они имеют практически одинаковый ответ. Но это не отвечает на главный вопрос.
Я пытаюсь сделать что-то подобное (приведенный ниже код — это всего лишь подсказка, для фактической компиляции требуется второй уровень параметризованного макроса)
#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) Мой вопрос заключается в следующем: возможно ли объединить строки и макросы в препроцессоре, чтобы получить окончательный строковый литерал как одну непрерывную строку?
Мобильная версия