информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеГде водятся OGRыПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] Да, это был один из вариантов, что я рассматривал... 28.06.03 14:06  Число просмотров: 1224
Автор: 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.
<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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach