Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
[C++] Спасибо, что рассказал; мне тоже было интересно, есть ли такие возможности. 27.06.03 21:13 Число просмотров: 1081
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
|
<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
|
|
|
|