Переменное число аргументов в макросе
От: Wasiliy  
Дата: 21.05.04 09:30
Оценка:
Подскажите пожалуйста, возможно ли передать переменное число аргументов в макрос?
В смысле, MY_MACROS(Param1, pAram2,...) — возможно ли так сделать?
Re: Переменное число аргументов в макросе
От: Leasg  
Дата: 21.05.04 09:33
Оценка:
Здравствуйте, Wasiliy, Вы писали:

W>Подскажите пожалуйста, возможно ли передать переменное число аргументов в макрос?

W>В смысле, MY_MACROS(Param1, pAram2,...) — возможно ли так сделать?

http://www.rsdn.ru/article/qna/cpp/define.xml
Автор(ы): Игорь Ткачёв, Александр Шаргин
Дата: 01.04.2001
Re: Переменное число аргументов в макросе
От: _nn_ www.nemerleweb.com
Дата: 21.05.04 09:49
Оценка: :)
Здравствуйте, Wasiliy, Вы писали:

W>Подскажите пожалуйста, возможно ли передать переменное число аргументов в макрос?

W>В смысле, MY_MACROS(Param1, pAram2,...) — возможно ли так сделать?

Если число параметров ограничено можно воспользоваться "перегрузкой" макроса.
#define X() F
#define X(x) F##x
#define X(x,y) F##x##y
#define X(x,y,z) F##x##y##z

void main()
{
 int X()=0; // int F=0;
 int X(a)=1; // int Fa=1;
 int X(ab)=2; // int Fab=2;
 int X(abc)=3; // int Fabc=3
}


При этом выпадает куча предупреждений но код компилируется.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Переменное число аргументов в макросе
От: CyberLord_  
Дата: 21.05.04 10:01
Оценка:
Здравствуйте, Wasiliy, Вы писали:

W>Подскажите пожалуйста, возможно ли передать переменное число аргументов в макрос?

W>В смысле, MY_MACROS(Param1, pAram2,...) — возможно ли так сделать?
#define PRINT(format, ...) printf(format, __VA_ARGS__);

Но только в С99.
Re: Переменное число аргументов в макросе
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 21.05.04 10:13
Оценка:
Здравствуйте, Wasiliy, Вы писали:

W>Подскажите пожалуйста, возможно ли передать переменное число аргументов в макрос?

W>В смысле, MY_MACROS(Param1, pAram2,...) — возможно ли так сделать?

Если весь смысл макроса состоит в вызове функции с тем же набором параметров, то есть такой вариант:
#define PRINT printf

PRINT("%d %s\n", 1, "test");
... << RSDN@Home 1.1.3 stable >>
Re[2]: Переменное число аргументов в макросе
От: WolfHound  
Дата: 21.05.04 10:28
Оценка:
Здравствуйте, Leasg, Вы писали:

L>http://www.rsdn.ru/article/qna/cpp/define.xml
Автор(ы): Игорь Ткачёв, Александр Шаргин
Дата: 01.04.2001

Уж лучше boost::preprocessor
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Переменное число аргументов в макросе
От: ArtDenis Россия  
Дата: 21.05.04 10:30
Оценка:
Здравствуйте, WolfHound, Вы писали:

L>> http://www.rsdn.ru/article/qna/cpp/define.xml
Автор(ы): Игорь Ткачёв, Александр Шаргин
Дата: 01.04.2001

W> Уж лучше boost::preprocessor

А с ним как это делается?
Posted via RSDN NNTP Server 1.9 alpha
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Переменное число аргументов в макросе
От: WolfHound  
Дата: 21.05.04 10:39
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Если число параметров ограничено можно воспользоваться "перегрузкой" макроса.

А где об этом в стандарте написано?

ЗЫ
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Переменное число аргументов в макросе
От: WolfHound  
Дата: 21.05.04 10:53
Оценка: 2 (1)
Здравствуйте, ArtDenis, Вы писали:

W>> Уж лучше boost::preprocessor

AD>А с ним как это делается?
СМ доки по поводу BOOST_PP_SEQ_*
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each.hpp>

#define SEQ (w)(x)(y)(z)

#define MACRO(r, data, elem) BOOST_PP_CAT(elem, data)

BOOST_PP_SEQ_FOR_EACH(MACRO, _, SEQ) // expands to w_ x_ y_ z_
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Переменное число аргументов в макросе
От: _nn_ www.nemerleweb.com
Дата: 21.05.04 12:36
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, _nn_, Вы писали:


__>>Если число параметров ограничено можно воспользоваться "перегрузкой" макроса.

WH> А где об этом в стандарте написано?
Об этом написано в стандарте ?

WH>ЗЫ


VC это компилит, а что насчет стандарта то это я не знаю.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Переменное число аргументов в макросе
От: vdimas Россия  
Дата: 25.06.04 23:53
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, WolfHound, Вы писали:


WH>>Здравствуйте, _nn_, Вы писали:


__>>>Если число параметров ограничено можно воспользоваться "перегрузкой" макроса.

WH>> А где об этом в стандарте написано?
__>Об этом написано в стандарте ?

WH>>ЗЫ


__>VC это компилит, а что насчет стандарта то это я не знаю.

он то компилит, но последнее переопределение define скрывает предыдущие
Re[5]: Переменное число аргументов в макросе
От: _nn_ www.nemerleweb.com
Дата: 26.06.04 06:49
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, _nn_, Вы писали:


__>>Здравствуйте, WolfHound, Вы писали:


WH>>>Здравствуйте, _nn_, Вы писали:


__>>>>Если число параметров ограничено можно воспользоваться "перегрузкой" макроса.

WH>>> А где об этом в стандарте написано?
__>>Об этом написано в стандарте ?

WH>>>ЗЫ


__>>VC это компилит, а что насчет стандарта то это я не знаю.

V>он то компилит, но последнее переопределение define скрывает предыдущие

Вот здесь вы не правы.

#define A() a
#define A(x) a##x
#define A(x,y) a##x##y
#define A(x,y,z) a##x##y##z

void main()
{
    int a=0,ab=1,abc=2,abcd=3;
    printf("%d %d %d %d",A(),A(b),A(b,c),A(b,c,d));
}


Результат : 0 1 2 3.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Переменное число аргументов в макросе
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 26.06.04 11:54
Оценка:
Здравствуйте, Wasiliy, Вы писали:

W>Подскажите пожалуйста, возможно ли передать переменное число аргументов в макрос?

W>В смысле, MY_MACROS(Param1, pAram2,...) — возможно ли так сделать?

http://www.rsdn.ru/article/qna/cpp/define.xml
Автор(ы): Игорь Ткачёв, Александр Шаргин
Дата: 01.04.2001
Re[6]: Переменное число аргументов в макросе
От: Plague Россия  
Дата: 26.06.04 14:02
Оценка:
Здравствуйте, _nn_, Вы писали:

>Вот здесь вы не правы.

#define A() a
#define A(x) a##x
#define A(x,y) a##x##y
#define A(x,y,z) a##x##y##z

void main()
{
    int a=0,ab=1,abc=2,abcd=3;
    printf("%d %d %d %d",A(),A(b),A(b,c),A(b,c,d));
}


Результат : 0 1 2 3.

Вот здесь Ты не прав

#define A() a
#define A(x) a##x
#define A(x,y) a##x##y
#define A(x,y,z) a##x##y##z  +1

void main()
{
    int a=0,ab=1,abc=2,abcd=3;
    printf("%d %d %d %d",A(),A(b),A(b,c),A(b,c,d));
}


Результат : 1 2 3 4.

Т.е. действительно переопределяются первые макросы!
... << RSDN@Home 1.1.3 stable >>
Re[7]: Переменное число аргументов в макросе
От: _nn_ www.nemerleweb.com
Дата: 26.06.04 14:30
Оценка:
Здравствуйте, Plague, Вы писали:

P>Здравствуйте, _nn_, Вы писали:


>>Вот здесь вы не правы.

P>
P>#define A() a
P>#define A(x) a##x
P>#define A(x,y) a##x##y
P>#define A(x,y,z) a##x##y##z

P>void main()
P>{
P>    int a=0,ab=1,abc=2,abcd=3;
P>    printf("%d %d %d %d",A(),A(b),A(b,c),A(b,c,d));
P>}
P>


P>Результат : 0 1 2 3.


P>Вот здесь Ты не прав


P>
P>#define A() a
P>#define A(x) a##x
P>#define A(x,y) a##x##y
P>#define A(x,y,z) a##x##y##z  +1

P>void main()
P>{
P>    int a=0,ab=1,abc=2,abcd=3;
P>    printf("%d %d %d %d",A(),A(b),A(b,c),A(b,c,d));
P>}
 
P>


P>Результат : 1 2 3 4.


P>Т.е. действительно переопределяются первые макросы!


В таком случае можно повеселиться еще больше :
Можно сделать макрос с выборочными аргументами !
#define A(x,y,z) a##x##y##z

void main()
{
    int a=0,ab=1,abc=2,abd=3;
    printf("%d %d %d %d",A(),A(b),A(b,c),A(b,,d));
}

Результат : 0 1 2 3.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Переменное число аргументов в макросе
От: vdimas Россия  
Дата: 27.06.04 00:29
Оценка:
Здравствуйте, _nn_, Вы писали:

__>
__>#define A() a
__>#define A(x) a##x
__>#define A(x,y) a##x##y
__>#define A(x,y,z) a##x##y##z

__>void main()
__>{
__>    int a=0,ab=1,abc=2,abcd=3;
__>    printf("%d %d %d %d",A(),A(b),A(b,c),A(b,c,d));
__>}
__>


__>Результат : 0 1 2 3.


ну ты дал...
попробуй так:
__>
__>#define A(x,y) a##x##y
__>#define A(x,y,z) b##x##y##z

__>void main()
__>{
__>    int abc=0, bbc=1, bbcc=2;
__>    printf("%d %d", A(b, c), A(b, c, c));
__>}
__>
Re[8]: Переменное число аргументов в макросе
От: vdimas Россия  
Дата: 27.06.04 00:31
Оценка:
Здравствуйте, _nn_, Вы писали:

__>В таком случае можно повеселиться еще больше :

__>Можно сделать макрос с выборочными аргументами !
__>[c]
__>#define A(x,y,z) a##x##y##z

Более того, с переменным числом параметров...
но особо не обольщайся — это не по стандарту,
однако и надейся, перезагрузка макросов предлагалась неоднократно
Re[2]: Переменное число аргументов в макросе
От: _Winnie Россия C++.freerun
Дата: 27.06.04 02:31
Оценка:
L>http://www.rsdn.ru/article/qna/cpp/define.xml
Автор(ы): Игорь Ткачёв, Александр Шаргин
Дата: 01.04.2001


IC++ это не компилит. И правильно делает, ибо фазы трансляции.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[9]: Переменное число аргументов в макросе
От: _nn_ www.nemerleweb.com
Дата: 27.06.04 05:09
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, _nn_, Вы писали:


__>>В таком случае можно повеселиться еще больше :

__>>Можно сделать макрос с выборочными аргументами !
__>>
__>>#define A(x,y,z) a##x##y##z

V>Более того, с переменным числом параметров...
V>но особо не обольщайся — это не по стандарту,
V>однако и надейся, перезагрузка макросов предлагалась неоднократно

Этим способом можно еще воспользоваться для такого :
// Вместо CAT2,CAT3,CAT4,CAT5 .... всего один макрос
#define CAT(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9) \
 a0##a1##a2##a3##a4##a5##a6##a7##a8##a9

CAT(a,b)

CAT(a,b,c)

CAT(a,b,c,d)

//...


Я вот подумал, что раз при не задании аргумента в макросе он становится пустым возможно есть способ подсчитать колличество активных аргументов в макросе, если бы можно как-нибудь определять если аргумент макроса пустой или нет.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: Переменное число аргументов в макросе
От: _nn_ www.nemerleweb.com
Дата: 27.06.04 09:03
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Я вот подумал, что раз при не задании аргумента в макросе он становится пустым возможно есть способ подсчитать колличество активных аргументов в макросе, если бы можно как-нибудь определять если аргумент макроса пустой или нет.


Нашелся способ подсчитать количество аргументов в макросе :

Например так :
static int num_arg_macro;

void init_arg_macro() { num_arg_macro=0; }

template<typename T>
int f(T) { return ++num_arg_macro; }
int f() { return num_arg_macro; }

#define COUNTMACRO(count,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9) \
    (init_arg_macro(), \
    f(a0), \
    f(a1), \
    f(a2), \
    f(a3), \
    f(a4), \
    f(a5), \
    f(a6), \
    f(a7), \
    f(a8), \
    f(a9))

void main()
{
    int count=0;
    int a0=0,a1=1,a2=2,a3=3;
    printf("COUNTMACRO(count) - %d\n",COUNTMACRO(count));
    printf("COUNTMACRO(count,a0) - %d\n",COUNTMACRO(count,a0));
    printf("COUNTMACRO(count,a0,a1) - %d\n",COUNTMACRO(count,a0,a1));
    printf("COUNTMACRO(count,a0,a1,a2) - %d\n",COUNTMACRO(count,a0,a1,a2));
    printf("COUNTMACRO(count,a0,a1,a2,a3) - %d\n",COUNTMACRO(count,a0,a1,a2,a3));
}


Результат :

COUNTMACRO(count) — 0
COUNTMACRO(count,a0) — 1
COUNTMACRO(count,a0,a1) — 2
COUNTMACRO(count,a0,a1,a2) — 3
COUNTMACRO(count,a0,a1,a2,a3) — 4

http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.