информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft предупредила о двух незакрытых... 
 Перевод Firefox на DNS over HTTPS 
 Microsoft закрыла серьёзную уязвимость,... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Кста, это и раньше было возможно 28.06.03 00:44  Число просмотров: 854
Автор: 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.
<programming>
[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-2020 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach