#define (a, ...)

Тема в разделе "LANGS.C", создана пользователем _DEN_, 29 апр 2007.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Вот такой макрос:

    Код (Text):
    1. #include <iostream>
    2.  
    3. #define SHOW(a, ...) std::cout << a << std::endl
    4.  
    5. int main()
    6. {
    7.     SHOW("Preved", "Medved");
    8.  
    9.     return 0;
    10. }
    Как внутри макроса перебрать все остальные параметры?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вообще использовать макрос с переменным числом параметров - это зло) и, насколько я помню, стандартом не позволено.
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    это gcc? никак, вроде. То же самое ... в теле макроса, кажется, подставляет все параметры, ни то через пробелы, ни то через запятые..
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Всем спасибо, вопрос отпал.

    Comeau действительно послал этот код в баню.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    этот код пошлет в баню ms vc, и, я уверен, что lcc.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Great

    MSVC 8.0 кушает нормально.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну это восьмая) моя любимая шестая не кушает и правильно делает
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    _DEN_
    восьмерка понимает? не знал..
     
  9. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Это недокументированная возможность компилятора. По-видимому, работать с такими параметрами нужно так же, как и в обычных функциях с переменным числом параметром (макросы va_). Хотя использовать эту возможность не нужно, потому что она не поддерживается никем из остальных компиляторов. Более того, в MSDN она не описана и в исходниках RTL ни разу не используется.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ээээ жжошь)
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    maxdiver
    Вполне документированная.
    см. "Variadic macros" в MSDN.

    Кстати, в С99 такие макросы легализованы.
     
  12. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Great
    Ну почти попал в цель: оказывается, там надо писать __VA_ARGS__ ;)

    green
    Прикольно, а я не смог ничего найти. Странно, ссылочку в конце страницы "Macros" не заметил :)
    Действительно, вполне даже документированно, но совершенно непереносимо.
    Открыл Стандарт C++ 2003. Ничего подобного там не нашёл. Странно.
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    maxdiver
    C99 - это стандарт языка С.
     
  14. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    green
    )))))
    Я чувствовал, что я что-то не догоняю :)
     
  15. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    _DEN_
    Comeau в режиме C99 все нормально собирает
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Great

    Шестерка и стандарт это два совершенно несовместимых понятий.

    RedLord

    Это-то понятно, но речь все же шла о С++