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

Тема в разделе "Общие вопросы по С и С++", создана пользователем ДокторТуамОсес2, 24 июн 2009.

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

    ДокторТуамОсес2 Well-Known Member

    Регистрация:
    9 июн 2009
    Сообщения:
    99
    Симпатии:
    0
    Как в макросе передать параметр в строковый литерал?

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


    Т.к. по команде
    Код (Text):
    cout << f(my_string) << endl;
    выводится left##s##right

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

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

    Что делать?
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    ИМХО, макросы в С++ бесполезная вещь
     
  3. ДокторТуамОсес2

    ДокторТуамОсес2 Well-Known Member

    Регистрация:
    9 июн 2009
    Сообщения:
    99
    Симпатии:
    0
    Вопрос решён.

    Код (Text):
    #define f(s) "left" #s "right"
    На другом форуме не стали рассуждать "полезная это вещь или нет?", а просто помогли.
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Тем самым раскопав вам очередную яму
     
  5. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    по хорошему, аргументы макроса нужно экранировать скобками

    +1
     
  6. alexsid

    alexsid Гость

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

    ему макросы не нужны :)
     
  7. ДокторТуамОсес2

    ДокторТуамОсес2 Well-Known Member

    Регистрация:
    9 июн 2009
    Сообщения:
    99
    Симпатии:
    0
    Но не внутри строки

    Не знаю. И?

    То есть?
     
  8. European

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

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

    ДокторТуамОсес2 Well-Known Member

    Регистрация:
    9 июн 2009
    Сообщения:
    99
    Симпатии:
    0
    European
    А есть случаи при написании программ на C++ когда без макросов ну никак не обойтись?
    Ну или когда с макросами получается опасней, но ЗАТО код получается более быстрый, короткий и читабельный/обозримый?

    А книжку [10]Дьюхэрст С.Х.Скользкие места С++.Как избежать проблем при проектировании и компиляции ваших программ.2006г.264с можно почитать?

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

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

    Не читал такую
     
Загрузка...

Поделиться этой страницей