• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Как в макросе передать параметр в строковый литерал?

  • Автор темы ДокторТуамОсес2
  • Дата начала
Д

ДокторТуамОсес2

Как в макросе передать параметр в строковый литерал?

Код:
#define f(s) "left##s##right"
не работает.


Т.к. по команде
Код:
cout << f(my_string) << endl;

выводится left##s##right

а я хотел, чтобы вывелось leftmy_stringright.

Т.е. операция конкатенации ('##') внутри строки почему-то не работает.

Что делать?
 
E

European

ИМХО, макросы в С++ бесполезная вещь
 
Д

ДокторТуамОсес2

Вопрос решён.

Код:
#define f(s) "left" #s "right"

На другом форуме не стали рассуждать "полезная это вещь или нет?", а просто помогли.
 
E

European

Тем самым раскопав вам очередную яму
 
A

alexsid

чувак не знает о кросплатформном програмировании,
да и проблем совместимости между версиями API никогда не было...

ему макросы не нужны :)
 
Д

ДокторТуамОсес2

по хорошему, аргументы макроса нужно экранировать скобками
Но не внутри строки

чувак не знает о кросплатформном програмировании,
Не знаю. И?

Тем самым раскопав вам очередную яму
То есть?
 
E

European

Не буду долго писать, дам вам ссылочки на 2 книги. Их без труда можно найти в электорнном виде.
1 - Герб Саттер, Андрей Александреску. Стандарты программирования на С++.
Правило 16 - Избегайте макросов.
2 - Скотт Мэйерс (Meyers). Эффективное использование С++. 55 верных способов улучшить структуру и код ваших программм.
Правило 2: Предпочитайте const, enum и inline использованию #define.

Эти книги пережили по несколько изданий, поэтому номера правил могут отличаться. Надеюсь, я чем-то помог вам :)
 
Д

ДокторТуамОсес2

European
А есть случаи при написании программ на C++ когда без макросов ну никак не обойтись?
Ну или когда с макросами получается опасней, но ЗАТО код получается более быстрый, короткий и читабельный/обозримый?

1 - Герб Саттер, Андрей Александреску. Стандарты программирования на С++.
Правило 16 - Избегайте макросов.
2 - Скотт Мэйерс (Meyers). Эффективное использование С++. 55 верных способов улучшить структуру и код ваших программм.
А книжку можно почитать?

Или она хуже тех, названия которых привели Вы?
 
E

European

А есть случаи при написании программ на C++ когда без макросов ну никак не обойтись?
ИМХО, один единственный случай: include guard. Всё остальное безболезнено заменяется на "правильные" конструкции С++.
код получается более быстрый, короткий и читабельный/обозримый?
А вы уверены? В вашем случае, если заменить макрос на inline функцию, то не по одному из пунктов выйгрыша не будет

Или она хуже тех, названия которых привели Вы?
Не читал такую
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!