Вывод обратной косой черты в макросе C ++

Можно ли в C ++ написать макрос, который ПОСЛЕ расширение будет выводить знак обратной косой черты?

Прямо сейчас я использую код:

#define SOME_ENUM(XX) \
XX(FirstValue,) \
XX(SecondValue,) \
XX(SomeOtherValue,=50) \
XX(OneMoreValue,=100) \

но я хочу написать макрос, который сгенерирует код выше, поэтому я хочу иметь возможность писать:

ENUM_BEGIN(name) // it should output: #define SOME_ENUM(XX) \
ENUM(ONE)        // it should output: XX(ONE,) \
//...

Но я не смог написать макрос, как ENUM_BEGINпотому что он должен расширяться до чего-то с обратной косой чертой в конце.
Возможно ли это в C ++?

2

Решение

Нет, это невозможно. Соответствующим этому будет §2.2.1, фаза перевода 2, описанная в ИСО / МЭК 14882: 2011 (E):

Каждый экземпляр символа обратной косой черты (), за которым сразу следует символ новой строки, удаляется, объединяя строки физического источника в
сформировать логические строки источника. Только последний обратный слеш на любом физическом
Исходная линия должна иметь право быть частью такого соединения. Если как
результат, последовательность символов, которая соответствует синтаксису
создается имя универсального символа, поведение не определено.
исходный файл, который не пуст и который не заканчивается новой строкой
символ, или заканчивающийся символом новой строки, непосредственно предшествующим
символом обратной косой черты до того, как произойдет любое такое соединение,
обрабатываться так, как если бы дополнительный символ новой строки был добавлен к
файл.

В основном, что произойдет, это \\\n (где \n физически в источнике, а не в побеге), будет трактоваться как \ символ, за которым следует сращивание линии. Остальные \ скорее всего, приведет к синтаксической ошибке (возможны ситуации, когда она допустима, но в настоящее время я ее не вижу), и не рассматривается на последующих этапах трансляции как сращивание строк (сращивание строк происходит только на этапе № 2).

1

Другие решения

Я не нашел никакой документации для этого, но я бы подумал, что вы могли бы просто сделать \\ и вы создадите обратную косую черту.

Тем не менее, в моем исследовании я вижу, что это не самая большая вещь, с которой вам придется иметь дело. Как только что прокомментировал millsj, у вас будут проблемы с выводом # в вашем ENUM_BEGIN. Увидеть Экранирование символа # в макросе #define? .

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector