Функциональный макрос вызывается только в том случае, если за его именем следует (
.
В F(G)
, G
не сопровождается (
, поэтому G
нет вызова макроса.
В F(G) G(1)
, G
является параметром макроса и, следовательно, не заменяется макросом напрямую (это очень запутанный макрос, который у вас есть: -O).В G(1)
, G
заменяется аргументом, соответствующим параметру G
, который также бывает G
.Эта замена затем повторно сканируется , а G(1)
оценивается как 1 + 1
.
Если мы переписываем ваши макросы, чтобы вы не использовали G
несколькими различными способами, это оченьлегче понять:
#define F(x) x(1)
#define G(x) x + 1
Здесь F(G)
заменяется на G(1)
.Затем он повторно сканируется и оценивается вызов G
, что дает 1 + 1
.