Давайте рассмотрим только один вызов;Я выберу это:
CFIT("address")
Препроцессор сначала выполняет подстановку аргументов .На этом этапе, если параметр (name
) находится в списке замены ({ _NAME },
; здесь я просто зачищаю пробелы), а не зашифрован или не участвует в вставке, то аргумент полностью раскрывается, и результатызаменяются на параметр.Здесь name
не появляется в этом списке замены, так что ничего не поделаешь.Таким образом, после подстановки аргумента у вас есть { _NAME },
.
Следующим шагом будет повторное сканирование и дальнейшая замена (после выполнения строкового преобразования и вставки, которых нет).На этом этапе оставшиеся токены повторно сканируются, чтобы макросы могли расширяться (после синей окраски текущего макроса, но это не имеет никакого эффекта).На этом этапе _NAME
распознается как объектоподобный макрос, поэтому его расширение начинается.Случается, что это расширяется до name
, но мы уже закончили с подстановкой аргументов, поэтому он не имеет отношения к параметру name
на данный момент ... это просто еще один токен.