VC6 и VC7, как я читал, несовместимы 99м. Впрочем, М$ и стандарты вещи несовместимые, за что я их и люблю. Они с детской непосредственностью привносят в нашу скучную жизнь элемент романтики и непредсказуемости...
У самого сейчас этих компилеров под рукой нет, проверить не могу. А вот gcc (и mingw в частности) откомпилили и не ругнулись даже безо всяких ключиков (вообще-то там есть такой параметр -std=c99). Один приятель попробовал на VC6, так там никаких variadic macrosov нет. В msdnовском референсе по препроцессору тоже ни намека. Так что, скорее всего, и VC7 c 99 пролетает. Хотя, если у кого-то есть под рукой, было бы интересно проверить.
По поводу твоего способа. Я на него тоже наткнулся, только не догнал, что там за ерунда со скобками и отложил, да и variadic macros нашел к тому времени. Зато попутно изобрел еще один изврат:
> Только делалось это примерно так > > #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.
Хочется макрос в котором есть 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 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 нашел к тому времени. Зато попутно изобрел еще один изврат:
> Только делалось это примерно так > > #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