Если мы сможем ограничить проблему, вы можете сделать это. В частности, если вы можете гарантировать, что DOUBLE
равен либо
- не определен как макрос или
- определяется как макрос, который расширяется до пустой последовательности токенов (например,
#define DOUBLE
),
тогда вы можете использовать косвенный подход с конкатенацией токенов:
#define F_IMPL_(x) DOUBLE_IS_DEFINED
#define F_IMPL_DOUBLE(x) DOUBLE_NOT_DEFINED
#define F_1(x, m) F_2(x, m)
#define F_2(x, m) F_IMPL_ ## m ( x )
#define F(x) F_1(x, DOUBLE)
Пример использования:
F(t)
#define DOUBLE
F(t)
Результат после предварительной обработки:
DOUBLE_NOT_DEFINED
DOUBLE_IS_DEFINED
Этот подход также будет работать, если DOUBLE
(если он определен) определен как макрос, который расширяется до одного известного токена, если этот токен может образовывать часть идентификатора (например, TRUE
или 1
). Чтобы справиться с этим, вам просто нужно переименовать макрос F_IMPL_
в F_IMPL_{TOKEN}
(например, F_IMPL_TRUE
или F_IMPL_1
).