Я хочу заменить некоторые токены в вызываемом макросе, но не могу определить правильный порядок расширения и \ или отсрочки. Например:
#define EXPAND(...) __VA_ARGS__
#define REPLACE(hello,y) EXPAND(y)
REPLACE(goodbye, hello world)
На мой взгляд, макрос REPLACE
будет вызывать макрос EXPAND
, что делает его функционально идентичным:
#define REPLACE(hello,y) hello world
Позволяя превратить hello world
в goodbye world
.
Мой компилятор (MSVC 2017), похоже, этого не делает, поэтому я подозреваю, что здесь я ошибаюсь. Я читал о расширении и отсрочке и пробовал много разных комбинаций DEFER()
и EXPAND()
, но, похоже, ни одна из них не дает результата, который мне нужен.
Есть ли у кого-нибудь представление о том, что я делаю не так?
REPLACE(goodbye, hello, world)
(обратите внимание на запятые), то довольно легко заменить hello на goodbye. Это то, что вы хотите? - person Lundin   schedule 29.03.2019REPLACE(goodbye, hello world)
, первым шагом является принятие параметров, упомянутых в списке замены (y
вEXPAND(y)
; не имеет значения, что это в круглых скобках), и замена их соответствующими аргументами (после раскрытия, что является пустым звуком, поскольку ни одинhello
иgoodbye
не являются объектными макросами). Это приводит кEXPAND(hello world)
. Как только все это будет сделано, результат будет повторно сканирован, и в этот моментEXPAND
распознается как вызов, вызывающий рекурсию. - person H Walters   schedule 29.03.2019