Повторно использовать / увеличивать определение макроса C? - PullRequest
0 голосов
/ 02 июля 2010

Есть ли способ сделать:

#define  A f1();
#define A A f2();  // this is wrong
#define A A f3(); // this is wrong
...
#define A A fn(); // this is wrong

A 

и затем получить

f1(); f2(); f3();  ... fn();

Ответы [ 4 ]

1 голос
/ 02 июля 2010

Вы можете использовать библиотеку препроцессора boost.Он может повторять макросы и многое другое:

http://www.boost.org/doc/libs/1_43_0/libs/preprocessor/doc/index.html

РЕДАКТИРОВАТЬ: я прочитал ваш комментарий и буду следить за решениями проще, чем следующий код ;-):

#include <boost/preprocessor/repetition/repeat.hpp>
#define A(z, n, text) text ## n = 0;
BOOST_PP_REPEAT(3, A, int x)

, который генерирует

int x0 = 0; int x1 = 0; int x2 = 0;

Обратите внимание, что это не является строгим решением, поскольку он не определяет макрос, который повторяет другой макрос, но повторяет уже определенный макрос.

0 голосов
/ 02 июля 2010
#define A f1();

...

#define TEMP_A A
#undef A
#define A TEMP_A f2();
#undef TEMP_A

...

Хотя я предлагаю вам рассмотреть это как:

#define A f1()
// Note the lack of the semicolon

...

#define TEMP_A
#undef A
#define A do { TEMP_A; f2(); } while (0)
#undef TEMP_A

Так как это позволит и правильно использовать точки с запятой при вызове макросов в коде.

Ситуация усложняется, если ваши функции возвращают значения и вы хотите получить доступ к этим значениям, но тогда вам следует изучить использование оператора комы.

#define A (( TEMP_A, f2() ))

Это позволит вам A возвращать значение, возвращаемое f2() после выполнения TEMP_A, то есть f1(). Двойные круглые скобки делают это так, что если вы делаете что-то глупое, как:

printf A;

он не пытается рассматривать его как список аргументов и только как один аргумент.

0 голосов
/ 02 июля 2010

Когда вы пишете

#define foo [something]

если в [something] обнаружен foo, он просто игнорируется.

Так что кажется, что вы не можете выполнить рекурсию с препроцессором и использовать некрасивые хаки, такие как BOOST_REPEAT, который "учит препроцессор считать" путем перечисления уродливых макросов. То, что вы просите, не просто обойтись без BOOST_REPEAT.

0 голосов
/ 02 июля 2010

Да.

#define  A f1();
#define B A f2();  // this is right

B 
...