Macro реализующее "скрытый дополнит." аргумент macro
От: Аноним  
Дата: 09.06.10 17:52
Оценка:
Здравствуйте.
Было такое 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;

Мне кажется, что где-то я этот трюк видела, но не припомню где, а может просто кажется что видела
C macro
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.