Здравствуйте.
Было такое macro, упрощенно:
#define DEFINE_TRANSACTION(T, NAME, ARGT) static T NAME(ARGT arg){ \
int encript = 0; /* encript result or no. Always 0 */ \
T result; \
. . .
}
Раньше
encript мог быть равен только 0, теперь он может принимать значения: 0 или 1; и соответственно его необходимо явно указывать. Добавлять новый параметр в DEFINE_TRANSACTION нельзя. Вводить новое macro, что-то типа:
#define DEFINE_TRANSACTION_EX(OPT, T, NAME, ARGT) static T NAME(ARGT arg){ \
int encript = OPT & ENCRIPT_OPT_MASK; \
T result; \
. . .
}
крайне не желательно.
Было бы замечательно дать возможность пользователю macro писать так:
/* если encription не нужен; результат транзакции long long: */
DEFINE_TRANSACTION(long long, Transaction1, const char*)
/* должно разворачиваеться в: */
staic long long Transaction1(const char* arg) {
int encript = 0; /* do not encript result */
long long result;
. . .
}
/* и так, если нужен; результат транзакции Encripted long long: */
DEFINE_TRANSACTION(ENCRIPT(long long), Transaction2, const char*)
/* должно разворачиваеться в: */
staic long long Transaction2(const char* arg) {
int encript = 1; /* encript result */
long long result;
. . .
}
Здесь
ENCRIPT(long long
) должно каким-то образом стать причиной того, что переменной
encript будет присвоено значение 1.
т.е. мне необходимо переписать исходное macro DEFINE_TRANSACTION так:
#define DEFINE_TRANSACTION( T, NAME, ARGT ) static PULL_TYPE(T) NAME(ARGT arg) \
{ \
int encript = PULL_ENCRIPT(T); \
PULL_TYPE(T) result; \
. . .
}
Вопрос собственно с реализацией макросов PULL_ENCRIPT и PULL_TYPE.
PULL_ENCRIPT(T) должно разворачиваться в 0;
PULL_ENCRIPT(ENCRIPT(T)) --> 1;
PULL_TYPE(T) --> T;
PULL_TYPE(ENCRIPT(T)) --> T;
Мне кажется, что где-то я этот трюк видела, но не припомню где, а может просто кажется что видела