информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetЗа кого нас держат?Spanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Хочу странного от препроцессора... 27.06.03 17:50  
Автор: tatar_0x4e Статус: Member
<"чистая" ссылка>
Хочется макрос в котором есть sprintf с переменным количеством параметров естественно. Первый параметр макроса шоб был format string для sprintf, а второй - все остальные параметры этой чудной функции. Типа так:

#define SUPERMACRO(PARAM1, PARAM2) \
     ... \
     sprintf(str, PARAM1, PARAM2); \
    ... \

// call it
format = "Vasya %s или %s";
lastname1 =  "Pupkin";
lastname2 = "Kutkin";
SUPERMACRO(format, #lastname1, lastname2#)


---

Пм идее как-то надо сказать препроцессору, что то, что между номерами - один параметр, то есть чтобы он игнорировал запятую между lastname1,2... Интересно такое возможно?.
[C++] Кажися нашел... 27.06.03 19:26  
Автор: tatar_0x4e Статус: Member
<"чистая" ссылка>
Это называется variadic macros, определен в стандарте C99.
#define SUPERMACRO(PARAM1, ...) sprintf (str, PARAM1,_VA_ARGS_

---
а еще можно так
#define SUPERMACRO(PARAM1, PARAM2...) sprintf (str, PARAM1, ##PARAM2)

---

А это даже компилится :)

#include <stdio.h>

#define SUPERMACRO(P1, ...) printf(P1,_VA_ARGS_;
#define SUPERMACRO2(P1, P2...) printf(P1, ##P2);

int main() {
    SUPERMACRO("HAHA %s, %s", "sss", "aaa")
    SUPERMACRO2("HAHAHA %s %s %s", "dd", "ggg", "f")
    return 0;
}

---

Короче, вопрос снят.




[C++] Кста, это и раньше было возможно 28.06.03 00:44  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Только делалось это примерно так

#ifdef DBG
#define DBGPRINT(Level, Args) \
if (Level >= CurrentDebugLevel) \
KdPrint Args
#endif

И работало это примерно так:

void
SomeFunc(int arg1, int arg2) {
DBGPRINT(DBG_FLOW, ("Entering SomeFunc(%d, %d)\n", arg1, arg2))
// ...
}

Весь прикол в том, что второй параметр макроса передается в скобках, причем вместе со скобками. Удобство использования может и меньше чем variadic macro. Но это как привык, и кроме того от препроцессора больше и не надо. А кроме того поддерживается всеми компиляторами. И VC6, которым я пользуюсь тоже :-), хотя думаю он не совсем C99 compliant.
[C++] Да, это был один из вариантов, что я рассматривал... 28.06.03 14:06  
Автор: tatar_0x4e Статус: Member
<"чистая" ссылка>
VC6 и VC7, как я читал, несовместимы 99м. Впрочем, М$ и стандарты вещи несовместимые, за что я их и люблю. Они с детской непосредственностью привносят в нашу скучную жизнь элемент романтики и непредсказуемости...

У самого сейчас этих компилеров под рукой нет, проверить не могу. А вот gcc (и mingw в частности) откомпилили и не ругнулись даже безо всяких ключиков (вообще-то там есть такой параметр -std=c99). Один приятель попробовал на VC6, так там никаких variadic macrosov нет. В msdnовском референсе по препроцессору тоже ни намека. Так что, скорее всего, и VC7 c 99 пролетает. Хотя, если у кого-то есть под рукой, было бы интересно проверить.

По поводу твоего способа. Я на него тоже наткнулся, только не догнал, что там за ерунда со скобками и отложил, да и variadic macros нашел к тому времени. Зато попутно изобрел еще один изврат:

#define SUPERMACRO(FORMAT, PARAMS) printf(FORMAT, PARAMS);

Юзаем:

#define ARGS arg1, arg2, arg3
SUPERMACRO("%s %s %s", ARGS)
#undef ARGS

:)))

> Только делалось это примерно так
>
> #ifdef DBG
> #define DBGPRINT(Level, Args) \
> if (Level >= CurrentDebugLevel) \
> KdPrint Args
> #endif
>
> И работало это примерно так:
>
> void
> SomeFunc(int arg1, int arg2) {
> DBGPRINT(DBG_FLOW, ("Entering SomeFunc(%d, %d)\n", arg1,
> arg2))
> // ...
> }
>
> Весь прикол в том, что второй параметр макроса передается в
> скобках, причем вместе со скобками. Удобство использования
> может и меньше чем variadic macro. Но это как привык, и
> кроме того от препроцессора больше и не надо. А кроме того
> поддерживается всеми компиляторами. И VC6, которым я
> пользуюсь тоже :-), хотя думаю он не совсем C99 compliant.
[C++] Спасибо, что рассказал; мне тоже было интересно, есть ли такие возможности. 27.06.03 21:13  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach